2014-09-04 56 views
1

在我的應用程序中,客戶端使用由Observable支持的服務。每個服務調用都是基於會話的,因此必須在調用業務服務方法之前啓動會話。防止觀察對象被啓動,除非另一個觀察對象完成它的工作

爲了初始化會話,我做了一個Observable這樣做。我的問題是,無論何時客戶端並行使用多個業務服務,會話初始化都會被重複。客戶端代碼與會話無關。我需要一種初始化會話的方式,以便只能調用一次會話(當第一個業務服務方法被調用時)。基本上所有後續的業務觀察員都必須等待條件(會話初始化)。你能爲它畫一個圖案嗎?

客戶端代碼是這樣:

protected void onCreate(Bundle savedInstanceState) { 
    itemService.getItems(10).subscribe(new Observer<List<Item>>() {..}); 
    userService.getProfile().subscribe(new Observer<List<Profile>>() {..}); 
} 

雖然是2個電話,需要進行會話Observable一次只執行,使企業Observable拭目以待用於會話初始化完成,然後開始做它的工作。

謝謝。

+0

我不完全理解的問題,但也許你可以看看這裏的發佈連接模式:https://github.com/ReactiveX/RxJava/wiki/Connectable-Observable-Operators – nikoniko 2014-09-08 05:00:22

回答

0

既然你已經有一個會議Observable的實施,一個可能的解決方案是將其轉換爲AsyncSubject。它只會執行一次,並且僅向每個訂戶發出最後一個項目(或僅項目)。

根據您的會話初始化代碼是如何工作的,它可能是更優雅的使用Async運營商,如Async.start()Async.startFuture()之一創建會話觀測。

+0

對不起,我不能圍繞你的建議包裹我的頭。你能舉個例子嗎?我編輯了這個問題來澄清一點。謝謝。 – midnight 2014-09-05 10:45:51

2

如果會話初始化是可觀察到的,那麼你可以延遲依賴於它的其他所有觀測量,採用delay運營商與會話初始化觀察爲參數:http://reactivex.io/RxJava/javadoc/rx/Observable.html#delay%28rx.functions.Func1%29

+0

這幾乎是我需要的,只是推遲觀察者必須是第一個被執行的人。延遲似乎執行延遲可觀察和應用延遲後可觀察。 – midnight 2014-09-09 08:17:49

+0

您也可以使用flatMap,它可以被理解爲在源Observable的每次發射之後運行新的Observable。但我傾向於說,你可能從錯誤的角度思考問題。觀察者不應該是「工作」,他們應該只是事件流或數據流。如果Observable A和B依賴於X的值,則需要開始查看諸如'flatMap'或'map'的運算符。 – 2014-09-09 08:34:47