AsyncTaskLoader 不会脱机缓存数据



我创建了一个AsyncTaskLoader,用于从API加载JSON数据。但是,我注意到,如果我旋转设备的屏幕,它会尝试再次从 API 加载数据。

因此,如果我关闭互联网连接并旋转屏幕,加载程序将无法返回数据,因为 HTTP 请求失败。

// NewsLoader.java
public class NewsLoader extends AsyncTaskLoader<String> {
private String url;
public NewsLoader(@NonNull Context context, String url) {
super(context);
this.url = url.trim();
}
@Override
protected void onStartLoading() {
forceLoad();
}
@Override
public String loadInBackground() {
if (url == null || url.isEmpty()) return null;
return NetworkUtils.fetchNews(url);
}
}

然后

// NewsActivity.java
// Initialising the loader
LoaderManager.getInstance(this).initLoader(LOADER_ID, args, this);
// onCreateLoader method
public Loader<String> onCreateLoader(int id, @Nullable Bundle args) {
// Process args and get url
return new NewsLoader(this, url);
}

据我所知,这不是加载器的正常行为。知道出了什么问题吗?

我最终弄清楚了问题所在。数据必须手动缓存,在 deliverResult(( 中截获加载的数据并将其保存在实例变量中以供以后使用。

这是更新的代码。

// NewsLoader.java
public class NewsLoader extends AsyncTaskLoader<String> {
private String url;
private String cachedData = null;
public NewsLoader(@NonNull Context context, String url) {
super(context);
this.url = url.trim();
}
@Override
protected void onStartLoading() {
if (cachedData != null) deliverResult(cachedData);
else forceLoad();
}
@Override
public String loadInBackground() {
if (url == null || url.isEmpty()) return null;
return NetworkUtils.fetchNews(url);
}
@Override
public void deliverResult(String data) {
cachedData = data;
super.deliverResult(data);
}
}