Когда и почему в 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);
}