Когда и почему в AsyncTaskLoader вызывается метод deliveryResult?

Я хочу хорошо понять жизненный цикл AsyncTaskLoader. Я проверил несколько ресурсов, все ясно, но использование deliveryResult. Согласно этой фотографии из интернета ( доступно здесь):

Будет вызываться onStartLoading, затем, если данные уже загружены, вызывается deliveryResult, тогда он доставляет результат в onLoadFinished. Однако, если нет данных, будет вызвана foceLoad, затем loadInBackground, затем deliveryResult, затем onLoadFinished.

Я сделал то же самое, что и в предложении croworc: Что делает AsyncTaskLoader.deliverResult()?

Это код:

public class WeatherLoader extends AsyncTaskLoader<List<Weather>> {

    List <Weather> receivedData;
    /** Tag for log messages */


    private String mUrl;


public WeatherLoader(Context context, String url) {
        super(context);
        mUrl = url;
    }

    @Override
    protected void onStartLoading() {
        if (receivedData == null){
            Log.i ("loader ", "No data yet");
            forceLoad();
        } else {
            deliverResult(receivedData);
            Log.i ("loader ", "data is available no reload");
        }

    }

    @Override
    public void deliverResult(List<Weather> data) {
        receivedData = data;

        super.deliverResult(data);
        Log.i ("loader ", "deliver result");
    }

    @Override
    public List<Weather> loadInBackground() {
        Log.i ("loader ", "load in background");
        if (mUrl == null) {
            return null;
        }

        // Perform the network request, parse the response, and extract a list of earthquakes.
        List<Weather> weather = getweatherData(mUrl);
        return weather;
    }

}

Но это последовательность обратных вызовов, которые я получаю, когда я инициализирую загрузчик или перезапускаю его: onCreatLoader

Данных пока нет

загрузить в фоновом режиме

onLoaderFinish

доставить результат

Что меня действительно смущает, так это то, что deliveryResult вызывается после onLoaderFinished, что также, я думаю, противоречит этой странице этой книги:

доступно здесь

Проверка доступности данных, используемых в onStartLoading, который вызывает метод deliveryResult, вызывается только тогда, когда действие останавливается и перезапускается, например, если я перехожу к другому действию, а затем возвращаюсь к нему. Вот что печатается в logcat в этом случае:

deliver result
data is available no reload

Четное onLoadFinished не вызывается в этом случае. Однако, если я делаю то же самое поведение, переходя к другому действию и возвращаясь к первому с наличием deliveryResult с его исходным поведением (где я вызываю только супер версию), вызывается onStart, затем loadInBackground, затем onLoadFinished, затем DeliverResult. Итак, новая загрузка происходит

Может кто-нибудь уточнить, почему происходит такое поведение обратных вызовов? Значит ли это, что изображение, показывающее жизненный цикл, неточно?

Благодарю.

1 ответ

Решение

Поставьте журнал вызовов перед вызовом super и снова проверьте последовательность потоков.

onLoadFinished вызывается во время вызова super.deliverResult.

     @Override
    public void deliverResult(List<Weather> data) {

        Log.i ("loader ", "deliver result");
        receivedData = data;

        super.deliverResult(data);

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