2016-12-06 163 views
1

我有這個問題,我一直在尋找,但找不到解決方案(或者我不能根據其他答案做出解決方案)。RxJava等待一個觀察者與訂閱者等待另一個觀察者與其他訂閱者

我的問題是,我需要找到一種方式來等待一個觀察者(用它自己的用戶)並等待另一個觀察者(用它自己的用戶)來完成。

這是情景:

OBS1 - > retryWith(tokenAuthenticator) - > SUBSCRIBER1 - >更新UI

OBS2 - >需要等待OBS1獲得新令牌 - > subscriber2用戶 - > 更新UI

我主要關心的是我需要兩個訂戶。我的觀點obs1和obs2並行運行,但需要檢查obs1是否用新會話標記結束。也許這不是RxJava的主要目的。

Obs1連接到HTTP連接並獲取帶有數據的Json以填充用戶界面,obs2也是如此,但用其他json和其他信息填充UI。

對我來說唯一的問題是我的會話令牌每5分鐘過期,當我嘗試獲取新的obs2時,已經使用過期的會話令牌進行呼叫。

簡單的解決方案是在onComplete()subscriber1中執行obs2,但我知道它必須是一個更好的解決方案,使用RxJava。

+0

Rxjava爲您提供了各種可以幫助您的操作符,您可以嘗試使用這些操作符來處理例如。重試,重試,去抖等 –

+0

如果問題只在令牌刷新,比你可以從okhttp客戶端嘗試本機'Authenticator'我描述了它在其他問題:http://stackoverflow.com/questions/40762911/call-another-retrofit -call-on-subject-emission/40771313#40771313 –

回答

2

看看zip這將允許你結合兩個可觀察的結果(如果你想要並行運行)。這裏有一個例子:

obs1.subscribeOn(Schedulers.io()) 
    .zipWith(obs2.subscribeOn(Schedulers.io()), (x,y) -> new Both(x,y)) 
    .doOnNext(both -> updateUI(both)) 
    .subscribe(); 
+0

Dave,謝謝你的大力幫助。我已經看到了zip運算符,它是一樣的zip和zipWith?創建一對兩個結果來做到這一點並使用相同的訂戶是否是一個很好的解決方案?我在Rx非常新。 –

+0

對兩位訂戶使用一個訂戶是一個不錯的主意,因爲您可以更好地控制初始者的錯誤行爲(例如,一次故障會停止兩個可觀察事件)。 –

+0

Dave,這實際上很有用,但我有一個關於Schedulers.io()的問題。對於每個可觀察的,如果你在Schedulers.IO上訂閱,意味着它將運行在不同的線程中?或者它是多餘的?謝謝 –