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

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

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

流程是这样的:

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

主页 Activity -此 Activity 布局包含我创建的名为 LoadingFragment 的 fragment - LoadingFragment 中有一个方法订阅Service

发布的事件

我的问题是,无论何时发布事件,Fragment UI 都没有发生任何变化。

我记录了所有内容,我可以看到事件发布了正确的数据,但数据没有反射(reflect)在 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());
        }
    });

}

当我检查我的日志时,我发现一切正常,但 UI 没有反射(reflect)出来。我在这里缺少什么?

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

CircleProgressBar

编辑

到今天为止,我仍然没有弄清楚这一点。我还注意到当服务发布事件时我的适配器没有更新。以前,用于startService()context 是来自LoginActivitygetApplicationContext()。我认为这可能是个问题,所以我将其更改为获取 HomeActivity 的实例。我认为从我的 HomeActivity 启动服务会解决问题,但不幸的是我仍然得到相同的结果。

最佳答案

好的,所以没有人真正尝试回答我的问题,但我想通了。

我实际上跳过了 Service 类的文档部分,并不知道它是在主线程上执行的。为了解决这个问题,我必须运行一个 AsyncTask 来在后台执行我的操作。

我在代码库中唯一需要更改的是将执行代码从 onStartCommand 方法移动到 AsyncTask 中。 AsyncTask 将启动 onStartCommand,一切都应该正常工作。

我的代码现在看起来像这样:

服务

@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,因为这是我的事件总线向任何订阅者发布事件的东西。

此外,请记住,如果您要通过 bus 更改此 AsyncTask 的任何 View ,请确保订阅者使用 runOnUi 来执行,否则你会遇到运行时异常,因为你正试图从 MainThread 以外的地方更改 View 。

关于android - Fragment 上的圆形进度条未显示进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34627305/

相关文章:

android - 在 NavDirections 中找不到 safeargs 参数

android - 怎么限制seekbar固定步进

android - AsyncTask 中的 ProgressDialog 停止旋转

android - ProgressDialogue 抛出 NullPointerException

Android fragment 隐藏时可以点击(Maps v2 + Sliding Drawer issue)

java - 如何使用户按下的按钮在按下时缩小?

android - 没有找到类 "androidx.core.content.FileProvider"

java - 在java中使用parcelbale写单字节

java - listview.setOnItemClickListener 不起作用

android - 如何在两个 fragment onClick 按钮之间传递参数