2017-07-31 66 views
0

我正在使用加載程序實現網絡通信......因爲他們大多推薦它和「它們是生命週期感知」。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()不是標誌。

回答

1

一旦你呼叫deliverResult()數據被「推出」到onLoadFinished()回調方法,這是設計。

如果你打電話給deliverResult(null),你基本上說你的結果是空的,從LoaderManager的角度來看 - 你的Loader完成了他的工作,他「不關心」空值。

TL; DR - 是的,您需要自己處理空結果並呼叫restartLoader()使您的Loader再次運行。

+0

謝謝隊友!!!! – Audi

+0

沒問題。不要忘記註冊,接受答案。 :) – mrsegev