java - AsyncTaskLoader 不会离线缓存数据
问题描述
我创建了一个 AsyncTaskLoader 用于从 API 加载 JSON 数据。但是,我注意到如果我旋转设备的屏幕,它会再次尝试从 API 加载数据。
结果,如果我关闭 Internet 连接并旋转屏幕,加载程序将无法返回数据,因为 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);
}
}
推荐阅读
- javascript - 如何重写[--将数组转换为多个对象-]如下图,使其在IE中工作
- python - 我想在 git lab 中运行我的测试作为管道的一部分。需要有关 chrome 驱动程序的信息
- javascript - Mapbox 性能在滚动时更新
- javascript - 如何正确使用 useParams 来显示数据
- java - 为什么 @Bean 方法被代理但组件的方法不在 Spring 中?
- c# - 在 Windows 事件跟踪 (ETW) 中,TraceEventSession 不会从记事本中捕获读取事件
- python - 数据框中的复杂链
- android - 由于未解决的依赖关系,Android Gradle 项目同步失败
- function - 当这些数据项的值包含逗号和/或撇号时,如何在 Cognos 中过滤多个数据项?
- java - 为什么我通过创建一个扩展抽象类“Figure”的子类“Square”来获得 NullPointerException?