2015-12-12 53 views
16

我還是搞清楚RxJava,並用它做與改造2.一些網絡的東西一直試圖就我們對AA幾天,喜歡的代碼看起來更具可讀性,但現在所遇到的一個我似乎無法解決的問題。RxJava重新訂閱事件活動後恢復

我試圖執行登錄(它返回一個API令牌),然後使用該令牌都在同一個鏈中獲取一些初始數據使得鏈條的輸出爲所述令牌+數據。要做到這一點,我打電話給我的API服務與

apiClient 
    .login() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .flatMap(token -> getData(token)) 
    .subscribe(new Subscrber<Bundle>() {...}); 

這似乎很好,但我也想在啓動和停止時鏈條,以顯示進度條。所以我爲此添加了.doOnSubscribe().doOnUnsubscribe()。不過,我注意到在方向更改後,我試圖隱藏進度欄的片段始終爲空。

因此,我搜索並遇到了RxLifecycle庫,似乎它會幫助和我現在.cache()和取消訂閱事件鏈。但是我不知道如何在onCreate()之後再次訂閱相同的活動?我想我錯過了一些非常基本的東西,並希望得到任何幫助。

+1

你能做的最好的事情我分開你的邏輯和實現'MVP'模式。在此之後,'Presenter'類(理想情況下應該是每個視圖實例的單例)將處理所有聯網並在屏幕旋轉後保持視圖重建。實際上,有一個很漂亮的庫允許使用基於rxJava的'MVP'模式https://github.com/konmik/nucleus(它非常小)。即使你不想使用它,你可以得到一個想法,它是如何實現的 – Than

+0

嗯..好了,所以我想我需要纔去下來RxJava航線上良好的MVP執行讀了,以及... –

+1

'MVP'可以使代碼更cleanier,將解決這個問題,但也許它不是你要找的(這不是那麼容易整個應用程序架構切換到MVP)解決方案(這就是爲什麼我沒有張貼它作爲回答)。我相信你有一種方法可以在不使用MVP的情況下使用任何第三方庫或一些很好的模式,但我沒有任何干淨的解決方案。把我上面的評論當作「別人如何處理類似問題」。 – Than

回答

0

你需要確保你訂閱相同可觀察實例是從.cache()返回。通常,您可以將此實例存儲在單例中的某個位置(如Application類),保留的片段或Android服務。

+0

要小心,因爲cache()也會緩存錯誤! – scana

1

你不必使用任何架構模式來實現這一目標。雖然任何MVP/MVC是好事,對於關注點分離,檢測等,使您的控制器/演示/ DAO的應用範圍單,這使內存通過整個應用程序生命週期是不完全是一個好主意。

下面是使用保留的片段實例和RxJava樣本項目 - https://github.com/krpiotrek/RetainFragmentSample

主要思路是利用碎片與setRetainInstance(真)調用,以保護它從方向變化被破壞,並保存你的在那裏可以觀察。這裏是你如何處理,在活動/片段的onCreate

protected void onCreate(Bundle savedInstanceState) { 
    if (savedInstanceState == null) { 
     // first run, create observable 
     mInfoObservable = createInfoObservable(); 
     // set Observable in retained fragment 
     RetainFragmentHelper.setObject(this, getSupportFragmentManager(), mInfoObservable); 
    } else { 
     // following runs, get observable from retained fragment 
     mInfoObservable = RetainFragmentHelper.getObjectOrNull(this, getSupportFragmentManager()); 
    } 

    // subscribe 
    mInfoObservable.subscribe(...); 
} 

請記住,你可觀察到具有緩存最後一個值,一種方法是使用緩存()操作。