Структура загрузчика и жизненный цикл деятельности

Мне действительно нравится 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);
        }
    }
}

Означает ли это, что я должен вручную отслеживать состояние загрузчика, когда действие выходит на передний план, и перезапускать его: если загрузчик отменен, а данные по-прежнему не публикуются (т.е. выполняются ли те же действия еще раз)? Есть ли способ обойти эту проблему?

0 ответов

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