【问题标题】:When and why deliverResult is called in AsyncTaskLoader?何时以及为什么在 AsyncTaskLoader 中调用 DeliverResult?
【发布时间】:2017-05-14 18:28:39
【问题描述】:

我想对 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 之后调用的,我也认为这与本书的这一页相矛盾:

available here

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

deliver result
data is available no reload

在这种情况下,即使 onLoadFinished 也不会被调用。 但是,如果我执行相同的行为,即导航到另一个活动并返回第一个活动,并让 DeliverResult 具有其原始行为(我只调用它的超级版本),则调用 onStart,然后调用 loadInBackground,然后onLoadFinished,然后是 DeliverResult。所以,一个新的负载发生了

谁能澄清为什么会发生这种回调行为?这是否意味着显示生命周期的图像不准确?

谢谢。

【问题讨论】:

    标签: android callback loader asynctaskloader


    【解决方案1】:

    在调用 super 之前放置日志调用,并再次检查流程顺序。

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

         @Override
        public void deliverResult(List<Weather> data) {
    
            Log.i ("loader ", "deliver result");
            receivedData = data;
    
            super.deliverResult(data);
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 2021-01-24
      • 2013-01-05
      • 2017-03-30
      相关资源
      最近更新 更多