2016-03-03 65 views
3

由於我的誤解,這是一個反應式編程的概念性問題,我想。防止每個訂閱都運行一個Observable

我有一個Observable發出一個網絡調用返回JSON,我filter(),看管理標誌的JSON,然後在subscribe()方法執行操作。

observable 
.filter((json) -> { return json.isAdmin; }) 
.subscribe((json) -> { /* Do things for admin */ }); 

我也想這樣做,但是當用戶是不是管理員:

observable 
.filter((json) -> { return !json.isAdmin; }) 
.subscribe((json) -> { /* Do things for non-admin */ }); 

我,如果我運行上面的兩個代碼塊現在意識到,網絡電話將是兩倍調用。

我知道我可以把一個if語句放在一個subscribe()方法中,但我不確定這是否被動方式。

有沒有一種方法可以保持上述結構,但只能將運動中的觀察點設置爲一次 - 即,一個網絡電話不是兩個?

看起來好像我想以多種方式對Observable的結果做出反應,而沒有使Observable多次運行。

回答

1

有兩大類可觀察量:hot and cold個。您所描述的一個可觀察的事件,其生成部分在每個subscribe()呼叫上執行,被稱爲。另一方面,無論客戶訂閱還是取消訂閱,observable通常都會發送項目。

爲您的使用情況下,運營商的家庭可能是合適的:connectpublishshare

一個例子:

ConnectableObservable</*Your type*/> connectable = Observable.just(1, 2, 3).publish(); 

connectable 
    .filter((json) -> { return json.isAdmin; }) 
    .subscribe((json) -> { /* Do things for admin */ }); 

connectable 
    .filter((json) -> { return !json.isAdmin; }) 
    .subscribe((json) -> { /* Do things for non-admin */ }); 

connectable.connect(); // here's when sharedObservable starts emitting items 

有一個測試運營商autoConnect()自動連接到可觀察的時候指定的客戶端數目被訂閱:

Observable<Integer> autoObservable = Observable.just(1, 2, 3).publish().autoConnect(2); 
autoObservable.subscribe(); 
autoObservable.subscribe(); // here's when autoObservable starts emitting items 

我不得不提到t他share()運營商也經常使用,並且是.publish().refCount()的快捷方式。從它的javadoc:

返回多播(共享)原始Observable的新Observable。只要有至少一個訂閱者,這個可觀察者就會被訂閱併發布數據。當所有訂閱者取消訂閱時,它將取消訂閱源Observable。

Observable<Integer> shared = Observable.just(1, 2, 3).share(); 
shared.subscribe(); // starts emitting here... 
shared.subscribe(); // ... but is not triggered again, only starts listening for new emissions 
// (potential race condition regarding the first emitted item) 
+0

謝謝。那好極了。我稍後會玩,但這看起來正是我所錯過的。除了我看到的大量初學者教程外,您是否有關於如何更好地學習RxJava等的建議? – newfivefour

+0

@newfivefour我認爲你已經走上了正確的軌道,詢問這類問題。官方文檔非常好。 [此操作員頁面](http://reactivex.io/documentation/operators.html)非常棒,甚至有一個決策樹可以幫助您在不同情況下選擇合適的操作員。 [主體(http://reactivex.io/documentation/subject。html)(「熱門」observables)也是一個重要的概念,強烈推薦閱讀和使用。 – AndroidEx

+0

謝謝。該頁面很有用。我必須在大理石圖上找到我的頭......再次感謝。 – newfivefour