onLoadFinished не вызывается после возврата из нажатия кнопки HOME - PullRequest
8 голосов
/ 19 сентября 2011

При использовании пользовательского AsyncTaskLoader для загрузки данных из веб-службы, если я нажимаю кнопку HOME в середине процесса загрузки, а затем снова вхожу в приложение, метод onLoadFinished () не вызывается.Мой фрагмент вызывает setRetainInstance(true) в onActivityCreated(), и он также вызывает getLoaderManager.initLoader(0, null, this) в том же методе (как рекомендуется).

Во время тестирования я вижу, что при возврате к фрагменту onActivityCreated()не вызывается, поэтому может быть поэтому onLoadFinished() не вызывается.Но куда еще положить метод initLoader()?Я читал в нескольких местах, что это не должно называться в onResume().

Итак, есть идеи?У меня в приложении много загрузчиков на разных экранах, и мне нужно элегантно решить эту проблему.

1 Ответ

22 голосов
/ 20 сентября 2011

После рассмотрения проблемы 14944 (http://code.google.com/p/android/issues/detail?id=14944), я решил проблему, переопределив onStartLoading() в своем пользовательском AsyncTaskLoader и вызвав forceLoad().

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

public abstract class AsyncLoader<D> extends AsyncTaskLoader<D> {

    private D data;

    public AsyncLoader(Context context) {
        super(context);
    }

    @Override
    public void deliverResult(D data) {
        if (isReset()) {
            // An async query came in while the loader is stopped
            return;
        }

        this.data = data;

        super.deliverResult(data);
    }


    @Override
    protected void onStartLoading() {
        if (data != null) {
            deliverResult(data);
        }

        if (takeContentChanged() || data == null) {
            forceLoad();
        }
    }

    @Override
    protected void onStopLoading() {
         // Attempt to cancel the current load task if possible.
        cancelLoad();
    }

    @Override
    protected void onReset() {
        super.onReset();

        // Ensure the loader is stopped
        onStopLoading();

        data = null;
    }
}
...