Круг выполнения на фрагменте не показывает прогресс
Я пытаюсь показать обратную связь, процент от которого они загрузили данные с сервера.
Поток идет примерно так:
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());
}
});
}
Когда я проверяю свои журналы, я вижу, что все идет хорошо, но пользовательский интерфейс не отражает это. Что мне здесь не хватает?
РЕДАКТИРОВАТЬ Забыл упомянуть. Я использую эту библиотеку для моего индикатора выполнения круга:
РЕДАКТИРОВАТЬ
На сегодняшний день мне еще предстоит выяснить это. Я также заметил, что мой адаптер не обновляется, когда служба публикует событие. Ранее 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
,