Структура загрузчика и жизненный цикл деятельности
Мне действительно нравится loaders
и их преимущества. Но я сталкиваюсь с проблемой, которую не знаю, как решить. В своей деятельности я использую AsyncTaskLoader, чтобы загрузить некоторые данные из базы данных и предоставить курсор на onLoadFinished(Loader<Cursor> loader, Cursor cursor)
метод, который реализуется деятельностью. Проблема в том, что onLoadFinished()
не вызывается, когда активность находится в onStop()
состояние (не окончание ()), например, произошел входящий вызов.
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
mActionBar.setDisplayShowTitleEnabled(false);
mActionBar.setDisplayHomeAsUpEnabled(true);
if (bundle != null) {
mFilter = FilterParameters.restoreFromBundle(bundle);
} else {
mFilter = new FilterParameters();
}
setupNavigationMode();
loadData();
}
private void loadData() {
getSupportLoaderManager().initLoader(0, null, this).forceLoad();
}
В loadInBackground()
я просто симулирую некоторую работу в фоновом режиме
private static class GisObjectDatabaseLoader extends AsyncTaskLoader<Cursor> {
public GisObjectDatabaseLoader(Context context) {
super(context);
}
@Override
public Cursor loadInBackground() {
int i = 10;
while (i > 0) {
Log.d(GisObjectDatabaseLoader.class.getSimpleName(), "TICK #" + (10 - i));
try {
Thread.sleep(1000);
i--;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
}
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
Fragment f = getSupportFragmentManager().findFragmentByTag(ProgressDialogFragment.TAG);
if (f == null)
new ProgressDialogFragment().show(getSupportFragmentManager(), ProgressDialogFragment.TAG);
Log.d(GeneralMapActivity.class.getSimpleName(), "SHOW PROGR");
return new GisObjectDatabaseLoader(this);
}
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
Fragment f = getSupportFragmentManager().findFragmentByTag(ProgressDialogFragment.TAG);
if (f != null) {
((ProgressDialogFragment) f).dismissAllowingStateLoss();
}
Log.d(GeneralMapActivity.class.getSimpleName(), "CANCEL PROGR");
}
Загрузчик все еще работает, когда активность остановлена и "тикает" на LogCat
, Я посмотрел на источник AsyncTaskLoader
void dispatchOnLoadComplete(LoadTask task, D data) {
if (mTask != task) {
if (DEBUG) Slog.v(TAG, "Load complete of old task, trying to cancel");
dispatchOnCancelled(task, data);
} else {
if (isAbandoned()) {
// This cursor has been abandoned; just cancel the new data.
onCanceled(data);
} else {
mLastLoadCompleteTime = SystemClock.uptimeMillis();
mTask = null;
if (DEBUG) Slog.v(TAG, "Delivering result");
deliverResult(data);
}
}
}
Означает ли это, что я должен вручную отслеживать состояние загрузчика, когда действие выходит на передний план, и перезапускать его: если загрузчик отменен, а данные по-прежнему не публикуются (т.е. выполняются ли те же действия еще раз)? Есть ли способ обойти эту проблему?