Fragment 上的圆形进度条未显示进度

Circle Progress Bar on Fragment is not showing progress

我正在尝试向反馈显示他们从服务器下载数据的百分比。

流程是这样的:

LoginActivity - onSuccess,调用Service下载数据 - 当 Service 工作时,我已经将用户切换到 HomeActivity

HomeActivity -此活动布局包含我创建的名为 LoadingFragment 的片段 - LoadingFragment 中有一个方法 subscribedService

发布的事件

我的问题是,无论何时发布事件,片段 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 没有反映出来。我在这里错过了什么?

编辑 忘了说了。我将这个库用于我的圈子进度条:

CircleProgressBar

编辑

直到今天,我仍然没有弄清楚这个问题。我还注意到当服务发布事件时我的适配器没有更新。以前,用于 startService()context 是来自 LoginActivitygetApplicationContext()。我认为这可能是个问题,所以我将其更改为获取 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 事件的东西。

此外,请记住,如果您要从 AsyncTaskbus 更改任何视图,请确保订阅者使用 runOnUi 执行,否则您将遇到 运行 时间异常,因为您试图从 MainThread 以外的其他内容更改视图。