Круг выполнения на фрагменте не показывает прогресс

Я пытаюсь показать обратную связь, процент от которого они загрузили данные с сервера.

Поток идет примерно так:

LoginActivity - на Успех, позвони Service скачать данные - пока Service работает, я уже переключил пользователя на HomeActivity

HomeActivity -Эта схема действий содержит созданный мной фрагмент под названием LoadingFragment Есть метод в LoadingFragment то есть subscribed на событие, которое публикуется Service

Моя проблема в том, что интерфейс Fragment не меняется вообще, когда событие было опубликовано.

Я зарегистрировал все, и я вижу, что событие публикует правильные данные, но данные не отображаются в пользовательском интерфейсе.

Ниже мой 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());
        }
    });

}

Когда я проверяю свои журналы, я вижу, что все идет хорошо, но пользовательский интерфейс не отражает это. Что мне здесь не хватает?

РЕДАКТИРОВАТЬ Забыл упомянуть. Я использую эту библиотеку для моего индикатора выполнения круга:

CircleProgressBar

РЕДАКТИРОВАТЬ

На сегодняшний день мне еще предстоит выяснить это. Я также заметил, что мой адаптер не обновляется, когда служба публикует событие. Ранее context использовал к startService() был getApplicationContext() от LoginActivity, Я подумал, что это может быть проблемой, поэтому я изменил его, чтобы получить экземпляр HomeActivity вместо. Я думал, что увольнение службы из моего HomeActivity решил бы проблему, но я все еще получаю те же результаты, к сожалению.

1 ответ

Решение

Хорошо, так что никто не пытался ответить на мой вопрос, но я понял это.

Я на самом деле экономил на части документации Service класс и не знал, что это выполняется в главном потоке. Чтобы это исправить, мне пришлось запустить 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 так как это было что-то для моего автобуса событий, чтобы публиковать события для любых подписчиков.

Кроме того, имейте в виду, что если вы собираетесь изменить какие-либо взгляды из этого AsyncTask сквозь busубедитесь, что подписчик использует runOnUi выполнить, иначе вы получите исключение времени выполнения, так как вы пытаетесь изменить представление из чего-то другого, кроме MainThread,

Другие вопросы по тегам