Fragment上的Circle Progress Bar未显示进度

时间:2016-01-06 06:53:49

标签: android android-fragments android-progressbar event-bus otto

我试图反馈他们从服务器下载数据的百分比。

流程如下:

LoginActivity   - onSuccess,请致电Service下载数据   - Service正在运行时,我已将用户切换为HomeActivity

HomeActivity    - 这个活动布局包含我创建的名为LoadingFragment的片段    - LoadingFragment中有一个subscribed方法Service发布的事件Service

我的问题是,只要发布了一个事件,Fragment UI就不会发生变化。

我记录了所有内容,我可以看到事件发布了正确的数据,但数据没有反映在用户界面上。

以下是我的@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()); } }); } 已订阅的方法

context

当我查看我的日志时,我看到一切正常,但UI没有反映出来。我在这里缺少什么?

修改 忘了提。我将此库用于我的圈子进度条:

CircleProgressBar

修改

截至今天,我还没有弄清楚这一点。我还注意到,当服务发布事件时,我的适配器没有更新。以前,用于startService()的{​​{1}}是来自getApplicationContext()的{​​{1}}。我认为这可能是一个问题所以我改变它来获取LoginActivity的实例。我认为从我的HomeActivity解雇服务会解决问题,但遗憾的是我仍然得到相同的结果。

1 个答案:

答案 0 :(得分:1)

好吧所以没有人真的试图回答我的问题,但我想出来了。

我实际上对Service类的文档部分感到吝啬,并且不知道它正在主线程上执行。要解决此问题,我必须运行AsyncTask以在后台执行我的操作。

我在代码库中唯一需要更改的是将执行代码从onStartCommand方法移动到AsyncTaskAsyncTask将被启动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,因为这是我的活动总线向任何订阅者发布活动的内容。

此外,请注意,如果您要通过AsyncTask更改此bus中的任何观看次数,请确保订阅者使用runOnUi执行,否则您需要&#39 ; ll会遇到运行时异常,因为您尝试从MainThread以外的其他地方更改视图。