在哪种情况下,AsynkTaskLoader使用缓存数据?

时间:2017-06-27 01:20:16

标签: android caching android-loader asynctaskloader

我正在通过Loader了解AsynkTaskLoader及其实施情况。

在许多示例中,我已经看到在AsynkTaskLoader的onStartLoading方法中检查cache,如果它不为null,则直接传递结果。但是,此方法仅在Loader第一次调用时调用 已启动,因为例如当设备配置发生更改并且Loader再次从活动的OnCreate方法启动Loader直接调用onLoadFinished方法时。

为了更好地理解Loader的功能,我想知道如何重新创建使用缓存的情况。

这里有一些示例代码:

 static class ExampleAsyncTaskLoader extends AsyncTaskLoader<String>{
    String mCacheData;
    Bundle mArgs;

    ExampleAsyncTaskLoader(Context context, Bundle args) {
        super(context);
        mArgs = args;
    }

    @Override
    protected void onStartLoading() {
            /* If no arguments were passed, we don't have a query to perform. Simply return. */
        if (mArgs == null) {
            return;
        }

        if (mCacheData != null){
            deliverResult(mCacheData);
        }else {
            forceLoad();
        }
    }

    @Override
    public String loadInBackground() {

            /* Extract the search query from the args using our constant */
        String searchQueryUrlString = mArgs.getString(SEARCH_QUERY_URL_EXTRA);

            /* If the user didn't enter anything, there's nothing to search for */
        if (searchQueryUrlString == null || TextUtils.isEmpty(searchQueryUrlString)) {
            return null;
        }

            /* Parse the URL from the passed in String and perform the search */
        try {
            URL githubUrl = new URL(searchQueryUrlString);
            return NetworkUtils.getResponseFromHttpUrl(githubUrl);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public void deliverResult(String data) {
        mCacheData = data;
        super.deliverResult(data);
    }
}

1 个答案:

答案 0 :(得分:1)

如果Loader数据准备就绪,则销毁并重新创建活动(如在配置更改中) - 您将通过deliverResult接收它。 但是,在Activity暂停然后恢复的情况下 - 默认行为是重新获取数据,这是“本地缓存”有意义的时候。

相关问题