我正在使用加載程序實現網絡通信......因爲他們大多推薦它和「它們是生命週期感知」。Android加載器onLoadFinished()立即調用
但在我的情況下,我已經延長AsyncTaskLoader
覆蓋loadInBackground()
etc.etc。 最後,onLoadFinished()
被正常調用。
但是我的問題發生在網絡錯誤的情況下。如果數據爲空 ,則立即調用onLoadFinished()
,而不進行網絡調用。
作爲每谷歌的文檔:
在任一情況下,給定的回調與加載程序相關聯,並且 將被稱爲裝載狀態變化。如果在調用點 處,調用者處於其啓動狀態,並且所請求的加載程序已存在且已生成其數據,則將立即調用onLoadFinished(Loader,D)中的回調 (在此 函數內部),所以你必須爲此做好準備。
所以這件事我來處理,在我的活動,而不是使用initLoader()
國旗和下一次調用restartLoader()
保持跟蹤。或者我做錯了什麼。
我張貼下面我的代碼重要部分:
在主要活動:
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()
不是標誌。
謝謝隊友!!!! – Audi
沒問題。不要忘記註冊,接受答案。 :) – mrsegev