何时以及为什么在AsyncTaskLoader中调用deliverResult?

时间:2017-05-14 18:28:39

标签: android callback loader asynctaskloader

我希望对AsyncTaskLoader生命周期有一个很好的理解。我查了几个资源,一切都很清楚但是使用了deliverResult。根据互联网上的这张图片(available here):enter image description 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

提供结果

让我感到困惑的是,在onLoaderFinished之后调用了deliverResult,我认为这与本书的这一页相矛盾:

available here

只有当活动停止并重新启动时才会检查调用deliverResult的onStartLoading中使用的数据的可用性,就像我导航到另一个活动然后返回它一样。以下是在这种情况下在logcat中打印的内容:

deliver result
data is available no reload

在这种情况下,甚至不会调用onLoadFinished但是,如果我执行导航到另一个活动的相同行为并返回到第一个具有deliverResult及其原始行为的地方(我只调用它的超级版本),onStart被调用,然后loadInBackground,然后onLoadFinished,然后是DeliverResult。因此,新的负载发生

任何人都可以澄清为什么这种回调行为正在发生?这是否意味着显示生命周期的图像不准确?

感谢。

1 个答案:

答案 0 :(得分:1)

在调用super之前调用日志调用并再次检查流程序列。

在调用super.deliverResult期间调用onLoadFinished。

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

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

        super.deliverResult(data);

    }