【发布时间】:2017-07-31 03:40:58
【问题描述】:
我正在使用加载器实现网络通信......因为他们中的大多数人都推荐它并且“他们了解生命周期”。
但在我的情况下,我扩展了 AsyncTaskLoader 覆盖了 loadInBackground() etc.etc。
最后onLoadFinished()被正常调用。
但是我的问题是在网络错误的情况下发生的。如果数据为空
立即调用onLoadFinished(),无需网络调用。
根据谷歌文档:
在任何一种情况下,给定的回调都与加载器相关联,并且 将在加载程序状态更改时调用。如果在呼叫点 调用者处于启动状态,并且请求的加载器已经 存在并已生成其数据,然后回调 onLoadFinished(Loader, D) 将立即被调用(在这个内部 函数),所以你必须为此做好准备。
这是我必须处理的事情吗,使用标志进行跟踪,下次在我的活动中调用restartLoader() 而不是initLoader()。或者我做错了什么。
我在下面发布了我的代码的重要部分:
在主要活动中:
protected void postJson(int loaderId, Parcelable object, boolean loadOffline) {
Bundle bundle = new Bundle();
bundle.putParcelable(Constants.OBJ, object);
bundle.putBoolean(Constants.OFFLINE, loadOffline);
loaderManager.initLoader(loaderId, bundle, this);
}
NetworkAsyncTaskLoader
@Override
public Result loadInBackground() {
Constants.verbose("loadInBackground Called");
.....
Response tempResult;
try {
tempResult = loadFromNetwork();
........
} catch (IOException e) {
Constants.error("Network Error for loader Id: " + loaderId, e);
return null;
}
}
@Override
public void deliverResult(Result result) {
Constants.verbose("deliverResult called");
super.deliverResult(result);
}
onLoadFinished()在活动中
@Override
public void onLoadFinished(Loader loader, NetworkAsyncTaskLoader.Result data) {
hideProgress();
Constants.debug("Load finished for: " + loader.getId());
.....
}
下面是堆栈跟踪..
07-31 10:08:02.177 27677-28061/com.sample.test D/OkHttp: <-- HTTP FAILED: java.net.ConnectException: Failed to connect to ...
07-31 10:08:02.179 27677-28061/com.sample.test E/Test: Network Error for loader Id: 101
java.net.ConnectException: Failed to connect to ...
07-31 10:08:02.192 27677-27677/com.sample.test V/Test: deliverResult called
07-31 10:08:02.193 27677-27677/com.sample.test D/Test: Load finished for: 101
07-31 10:08:08.982 27677-27677/com.sample.test D/Test: Load finished for: 101
你可以看到下次我打电话给initLoader()或者尝试发起网络调用..它直接调用onLoadFinished()
更新:
我最终创建了一个标志,如果出现网络错误或出现问题,该标志设置为 false,然后如果标志为 true,则改为调用 restartLoader()。
【问题讨论】:
标签: android loader asynctaskloader