2017-06-26 41 views
0

我打電話給一個API。當應用程序啓動時,我需要從API獲取令牌以便能夠進行其他調用。該令牌由應用內的「令牌管理器」管理。我正在使用RxJava 2和Retrofit 2來管理呼叫。RxJava 2&Retrofit 2個順序獨立調用

當我啓動應用程序時,令牌管理器獲取令牌,並且碎片獲取數據。我期望這些調用按順序執行,因爲兩者都使用與Dagger 2一起注入的相同的Retrofit客戶端對象。 但是,實際上,在獲取令牌結束的調用之前執行獲取數據的調用,並且由於此調用需要令牌,請求失敗。

有人建議使用flatmap,但我不能在應用程序中的兩個不同位置(TokenManager類和Fragment)管理邏輯。 我該如何解決我的問題?

+0

你想鏈中的API調用,以便一前一後總是叫什麼名字? – Apoorv

+0

是的,這是主意。 – Eselfar

+0

看看https://stackoverflow.com/questions/36785090/chaining-requests-in-retrofit-rxjava – Apoorv

回答

1

所以根據你的描述你提到你不能使用flatmap(),但根據你的要求,似乎兩個調用之一是依賴於其他的。

反正可能性如下:

依賴通話 - 同一個地方(如活動),在這種情況下
你應該使用flatMap()例如調用A和B,調用必須獲得令牌,以便B可以被執行。
依賴電話 - 不同的地方(如服務 - 活動)
這種情況下最適合的方式是一個事件總線,並且可以使用PublishSubject從Rxjava實現這樣的事件總線。

所以在你的情況下,第二個解決方案是要走的路。 您在TokenManger中獲得令牌,然後通知任何屏幕需要它,您也可以通知其過期,所以應用程序不會不必要地擊中網絡。

作爲一個簡單的例子:

PublishSubject<Token> publishToken = PublishSubject.create(); 

//notify others that you got a Token 
publishToken.onNext(myToken); 
.. 
.. 
//in other place (eg fragment) 
getTokenEventBus().subscribe(token -> { 
    //do your other call 
}, throwable ->{ 
    //handle error 
},() -> { 
    //event complete 
}); 
+0

我終於用平面地圖解決了它,但你的答案很有趣。我會接受它,因爲現在這個問題已經很老了 – Eselfar