何时以及为何在 AsyncTaskLoader 中调用 deliverResult?
When and why deliverResult is called in AsyncTaskLoader?
我想深入了解 AsyncTaskLoader 生命周期。我检查了几个资源,一切都很清楚,但 deliverResult 的用法。这张图来自网络(available here):
会调用onStartLoading,如果有数据已经加载,则调用deliverResult,然后将结果传递给onLoadFinished。但是,如果没有数据,将调用 foceLoad,然后是 loadInBackground,然后是 deliverResult,然后是 onLoadFinished。
我按照这里建议的 croworc 答案做了同样的事情:What does AsyncTaskLoader.deliverResult() actually do?
这是代码:
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
交付结果
真正让我困惑的是 deliverResult 是在 onLoaderFinished 之后调用的,我认为这与本书的这一页相矛盾:
检查调用 deliverResult 的 onStartLoading 中使用的数据的可用性仅在 activity 停止并重新启动时调用,就像我导航到另一个 activity 然后返回它一样.在这种情况下,logcat 中打印的内容如下:
deliver result
data is available no reload
在这种情况下甚至 onLoadFinished
也不会被调用。 但是,如果我执行相同的行为导航到另一个 activity 并返回到第一个具有 deliverResult 的原始行为(我只调用它的超级版本),onStart 得到调用,然后是 loadInBackground,然后是 onLoadFinished,然后是 DeliverResult。所以,一个新的负载发生了
谁能解释一下为什么会发生这种回调行为?这是否意味着显示生命周期的图像不准确?
谢谢。
在调用 super 之前记录调用并再次检查流程顺序。
onLoadFinished 在调用 super.deliverResult 期间被调用。
@Override
public void deliverResult(List<Weather> data) {
Log.i ("loader ", "deliver result");
receivedData = data;
super.deliverResult(data);
}
我想深入了解 AsyncTaskLoader 生命周期。我检查了几个资源,一切都很清楚,但 deliverResult 的用法。这张图来自网络(available here):
会调用onStartLoading,如果有数据已经加载,则调用deliverResult,然后将结果传递给onLoadFinished。但是,如果没有数据,将调用 foceLoad,然后是 loadInBackground,然后是 deliverResult,然后是 onLoadFinished。
我按照这里建议的 croworc 答案做了同样的事情:What does AsyncTaskLoader.deliverResult() actually do?
这是代码:
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
交付结果
真正让我困惑的是 deliverResult 是在 onLoaderFinished 之后调用的,我认为这与本书的这一页相矛盾:
检查调用 deliverResult 的 onStartLoading 中使用的数据的可用性仅在 activity 停止并重新启动时调用,就像我导航到另一个 activity 然后返回它一样.在这种情况下,logcat 中打印的内容如下:
deliver result
data is available no reload
在这种情况下甚至 onLoadFinished
也不会被调用。 但是,如果我执行相同的行为导航到另一个 activity 并返回到第一个具有 deliverResult 的原始行为(我只调用它的超级版本),onStart 得到调用,然后是 loadInBackground,然后是 onLoadFinished,然后是 DeliverResult。所以,一个新的负载发生了
谁能解释一下为什么会发生这种回调行为?这是否意味着显示生命周期的图像不准确?
谢谢。
在调用 super 之前记录调用并再次检查流程顺序。
onLoadFinished 在调用 super.deliverResult 期间被调用。
@Override
public void deliverResult(List<Weather> data) {
Log.i ("loader ", "deliver result");
receivedData = data;
super.deliverResult(data);
}