Fragment 上的圆形进度条未显示进度
Circle Progress Bar on Fragment is not showing progress
我正在尝试向反馈显示他们从服务器下载数据的百分比。
流程是这样的:
LoginActivity
- onSuccess,调用Service
下载数据
- 当 Service
工作时,我已经将用户切换到 HomeActivity
HomeActivity
-此活动布局包含我创建的名为 LoadingFragment
的片段
- LoadingFragment
中有一个方法 subscribed
到 Service
发布的事件
我的问题是,无论何时发布事件,片段 UI 都没有发生任何变化。
我记录了所有内容,我可以看到事件发布了正确的数据,但数据没有反映在 UI。
下面是我的Service
:
@Override
public int onStartCommand(Intent intent, int flags, final int startId) {
Integer id = intent.getIntExtra("id", 0);
//do sync here
Log.i(LOG_TAG, "Make rest call to retrieve all r for id: " + id);
mRestClient.getApiService().getR(id, new Callback<List<R>>() {
@Override
public void success(List<R> rResponse, Response response) {
Integer outstanding = routeResponse.size();
Integer percentage;
LoadingEvent loadingEvent = new LoadingEvent();
SyncEvent syncEvent = new SyncEvent();
Log.i(LOG_TAG, "Callback success r");
System.out.println("yohellotest");
Log.i(LOG_TAG, "Begin insertion");
DaoMaster daoMaster = MyApp.getDaoMaster();
DaoSession session = daoMaster.newSession();
SQLiteDatabase db = session.getDatabase();
RDao rDao = session.getRDao();
WDao wDao = session.getWDao();
JDao jDao = session.getJDao();
Log.i(LOG_TAG, "--Beginning Transaction--");
//db.beginTransaction();
try {
int counter = 0;
for(int i = 0; i < rResponse.size(); i++) {
R r = rResponse.get(i);
rDao.insert(r);
Log.i(LOG_TAG, "inserted r: " + r.getId());
for(int j = 0; j < r.getW().size(); j++) {
W w = r.getW().get(j);
wDao.insert(w);
Log.i(LOG_TAG, "inserted w: " + w.getId());
for(int k = 0; k < w.getJ().size(); k++) {
J j = w.getJ().get(k);
jDao.insert(j);
Log.i(LOG_TAG, "inserted j: " + j.getJId());
}
}
counter += 1;
percentage = (int) Math.floor((double) counter / outstanding * 100);
loadingEvent.setPercentage(percentage);
bus.post(loadingEvent);
}
Log.i(LOG_TAG, "Finished inserting");
//db.setTransactionSuccessful();
} catch (Exception e) {
Log.i(LOG_TAG, "Exception happened " + e.getMessage().toString());
System.out.println("yo something happened, but I don't know what");
} finally {
Log.i(LOG_TAG, "--Closing transaction--");
//db.endTransaction();
}
syncEvent.setIsSuccess(true);
syncEvent.setStatus(200);
bus.post(syncEvent);
}
@Override
public void failure(RetrofitError error) {
Log.i(LOG_TAG, "Rest call failed for this api");
System.out.println("failtests");
}
});
return START_STICKY;
}
Fragment
订阅方法
@Subscribe
public void loadingResponse(final LoadingEvent loadingEvent) {
Log.i(LOG_TAG, "Response from loading: " + loadingEvent.getPercentage());
if(getActivity() == null)
return;
textTest.setText(loadingEvent.getPercentage().toString());
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Log.i(LOG_TAG, "Updating ui for loading text" + loadingEvent.getPercentage().toString());
mCircularProgressBar.setProgress(loadingEvent.getPercentage());
textTest.setText(loadingEvent.getPercentage().toString());
}
});
}
当我检查我的日志时,我看到一切正常,但 UI 没有反映出来。我在这里错过了什么?
编辑
忘了说了。我将这个库用于我的圈子进度条:
编辑
直到今天,我仍然没有弄清楚这个问题。我还注意到当服务发布事件时我的适配器没有更新。以前,用于 startService()
的 context
是来自 LoginActivity
的 getApplicationContext()
。我认为这可能是个问题,所以我将其更改为获取 HomeActivity
的实例。我认为从我的 HomeActivity
启动服务会解决问题,但不幸的是我仍然得到相同的结果。
好的,所以没有人真正尝试回答我的问题,但我想通了。
我实际上跳过了 Service
class 的文档部分并且不知道它是在主线程上执行的。为了解决这个问题,我不得不 运行 和 AsyncTask
在后台执行我的操作。
我在代码库中唯一需要更改的是将执行代码从 onStartCommand
方法移动到 AsyncTask
中。 AsyncTask
将启动 onStartCommand
并且一切正常。
我的代码现在看起来像这样:
Service
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
DownloadTask downloadTask = new DownloadTask();
downloadTask.execute();
return START_STICKY;
}
private class DownloadTask extends AsyncTask<Void, Void, LoginEvent> {
@Override
protected LoginEvent doInBackground(Void... params) {
//Code here to run my operations
//Call api, insert to db, post events etc...
//
}
@Override
protected void onPostExecute(LoginEvent event) {
//run anything here you want to do after execution
}
}
您可以忽略我的 LoginEvent
,因为这是我的事件总线向任何订阅者发送 post 事件的东西。
此外,请记住,如果您要从 AsyncTask
到 bus
更改任何视图,请确保订阅者使用 runOnUi
执行,否则您将遇到 运行 时间异常,因为您试图从 MainThread
以外的其他内容更改视图。
我正在尝试向反馈显示他们从服务器下载数据的百分比。
流程是这样的:
LoginActivity
- onSuccess,调用Service
下载数据
- 当 Service
工作时,我已经将用户切换到 HomeActivity
HomeActivity
-此活动布局包含我创建的名为 LoadingFragment
的片段
- LoadingFragment
中有一个方法 subscribed
到 Service
我的问题是,无论何时发布事件,片段 UI 都没有发生任何变化。
我记录了所有内容,我可以看到事件发布了正确的数据,但数据没有反映在 UI。
下面是我的Service
:
@Override
public int onStartCommand(Intent intent, int flags, final int startId) {
Integer id = intent.getIntExtra("id", 0);
//do sync here
Log.i(LOG_TAG, "Make rest call to retrieve all r for id: " + id);
mRestClient.getApiService().getR(id, new Callback<List<R>>() {
@Override
public void success(List<R> rResponse, Response response) {
Integer outstanding = routeResponse.size();
Integer percentage;
LoadingEvent loadingEvent = new LoadingEvent();
SyncEvent syncEvent = new SyncEvent();
Log.i(LOG_TAG, "Callback success r");
System.out.println("yohellotest");
Log.i(LOG_TAG, "Begin insertion");
DaoMaster daoMaster = MyApp.getDaoMaster();
DaoSession session = daoMaster.newSession();
SQLiteDatabase db = session.getDatabase();
RDao rDao = session.getRDao();
WDao wDao = session.getWDao();
JDao jDao = session.getJDao();
Log.i(LOG_TAG, "--Beginning Transaction--");
//db.beginTransaction();
try {
int counter = 0;
for(int i = 0; i < rResponse.size(); i++) {
R r = rResponse.get(i);
rDao.insert(r);
Log.i(LOG_TAG, "inserted r: " + r.getId());
for(int j = 0; j < r.getW().size(); j++) {
W w = r.getW().get(j);
wDao.insert(w);
Log.i(LOG_TAG, "inserted w: " + w.getId());
for(int k = 0; k < w.getJ().size(); k++) {
J j = w.getJ().get(k);
jDao.insert(j);
Log.i(LOG_TAG, "inserted j: " + j.getJId());
}
}
counter += 1;
percentage = (int) Math.floor((double) counter / outstanding * 100);
loadingEvent.setPercentage(percentage);
bus.post(loadingEvent);
}
Log.i(LOG_TAG, "Finished inserting");
//db.setTransactionSuccessful();
} catch (Exception e) {
Log.i(LOG_TAG, "Exception happened " + e.getMessage().toString());
System.out.println("yo something happened, but I don't know what");
} finally {
Log.i(LOG_TAG, "--Closing transaction--");
//db.endTransaction();
}
syncEvent.setIsSuccess(true);
syncEvent.setStatus(200);
bus.post(syncEvent);
}
@Override
public void failure(RetrofitError error) {
Log.i(LOG_TAG, "Rest call failed for this api");
System.out.println("failtests");
}
});
return START_STICKY;
}
Fragment
订阅方法
@Subscribe
public void loadingResponse(final LoadingEvent loadingEvent) {
Log.i(LOG_TAG, "Response from loading: " + loadingEvent.getPercentage());
if(getActivity() == null)
return;
textTest.setText(loadingEvent.getPercentage().toString());
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Log.i(LOG_TAG, "Updating ui for loading text" + loadingEvent.getPercentage().toString());
mCircularProgressBar.setProgress(loadingEvent.getPercentage());
textTest.setText(loadingEvent.getPercentage().toString());
}
});
}
当我检查我的日志时,我看到一切正常,但 UI 没有反映出来。我在这里错过了什么?
编辑 忘了说了。我将这个库用于我的圈子进度条:
编辑
直到今天,我仍然没有弄清楚这个问题。我还注意到当服务发布事件时我的适配器没有更新。以前,用于 startService()
的 context
是来自 LoginActivity
的 getApplicationContext()
。我认为这可能是个问题,所以我将其更改为获取 HomeActivity
的实例。我认为从我的 HomeActivity
启动服务会解决问题,但不幸的是我仍然得到相同的结果。
好的,所以没有人真正尝试回答我的问题,但我想通了。
我实际上跳过了 Service
class 的文档部分并且不知道它是在主线程上执行的。为了解决这个问题,我不得不 运行 和 AsyncTask
在后台执行我的操作。
我在代码库中唯一需要更改的是将执行代码从 onStartCommand
方法移动到 AsyncTask
中。 AsyncTask
将启动 onStartCommand
并且一切正常。
我的代码现在看起来像这样:
Service
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
DownloadTask downloadTask = new DownloadTask();
downloadTask.execute();
return START_STICKY;
}
private class DownloadTask extends AsyncTask<Void, Void, LoginEvent> {
@Override
protected LoginEvent doInBackground(Void... params) {
//Code here to run my operations
//Call api, insert to db, post events etc...
//
}
@Override
protected void onPostExecute(LoginEvent event) {
//run anything here you want to do after execution
}
}
您可以忽略我的 LoginEvent
,因为这是我的事件总线向任何订阅者发送 post 事件的东西。
此外,请记住,如果您要从 AsyncTask
到 bus
更改任何视图,请确保订阅者使用 runOnUi
执行,否则您将遇到 运行 时间异常,因为您试图从 MainThread
以外的其他内容更改视图。