我正在使用加载器实现网络通信......因为他们中的大多数都推荐它并且“它们具有生命周期意识”。
但在我的情况下,我已经AsyncTaskLoader
覆盖了loadInBackground()
等等。
最后,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()
。
答案 0 :(得分:2)
致电deliverResult()
后,数据被推出&#34;到onLoadFinished()
回调方法,这是按照设计的。
如果你打电话给deliverResult(null)
,你基本上说你的结果是空的,从LoaderManager的角度来看 - 你的装载机完成了他的工作,他&#34;不关心&#34 ;关于空值。
TL; DR - 是的,您需要自己处理空结果并致电restartLoader()
以使您的Loader再次运行。