2016-12-09 36 views
0

所以首先我會告訴你我有什麼,我想那裏發生:運行doOnNex在某些線程JA BehaviorSubject

我有一個BehavourSubject<DataObject>

private BehaviorSubject<DataObject> dataSubject = BehaviorSubject.create(); 

我還給在一定功能如下:

public Observable<DataObject> pendingData() { 
    return this.dataSubject.asObservable() 
     .doOnNext(data -> { 
      // do something with this data that has to be thread save. 
     }) 
     .observeOn(AndroidSchedulers.mainThread()); 
} 

我認爲發生的是,該doOnNext部分將在同一個線程中運行,在this.dataSubject.onNext(data);被調用。但是,因爲我做了一些必須保存在這個lambda中的線程,所以我應該把它放到信號量中,或者在某個線程中運行所有的動作。

我的第一個想法是「在rx中處理線程的正常方法」,但我不知道它的工作原理。 我認爲一個subscribeOn(certainBackgroundScheduler)添加到可觀察到的是這樣的:

public Observable<DataObject> pendingData() { 
    return this.dataSubject.asObservable() 
     .doOnNext(data -> { 
      // do something with this data that has to be thread save. 
     }) 
     .subscribeOn(certainBackgroundScheduler) 
     .observeOn(AndroidSchedulers.mainThread()); 
} 

但是,當我創建一個可觀察與認購塊,那麼這個塊在backgroundScheduler運行。當我在訂戶上呼叫onNext時,我在該線程中調用它是合乎邏輯的,但它在BehaviorSubject中是否一樣?

真的那麼簡單嗎?如果不是,我該如何強制主題在我的特定線程中運行doOnNext塊?

+0

而當你嘗試它時,它不起作用嗎? – weston

回答

1

真的那麼簡單嗎?如果不是,我該如何強制主體運行我的CertainThread中的doOnNext塊?

是的。請閱讀docssubscribeOnobserveOn作進一步說明。

+0

因此'doOnNext'塊在'observeOn'方法傳遞的線程中執行,而不是'subscribeOn'方法? –

+0

我有點不對。所以在你的最後一段代碼片斷中,'.doOnNext'在'certainBackgroundScheduler'上執行。您可以使用'Thread.currentThread()'方法輕鬆檢查。因此,正如doc所說,默認情況下,您的工作是在您訂閱的計劃程序中觀察到的。 –

+0

你可以編輯你的答案,以便它是正確的? –

2

您可以在您的連鎖店中擁有多個observeOn,讓您在不同的執行「地點」之間路由值。

dataSubject 
.observeOn(backgroundScheduler) 
.doOnNext(v -> /* this will run on another scheduler. */) 
.observeOn(AndroidSchedulers.mainThread()) 
.doOnNext(v -> /* this will run on main after the previous */) 
相關問題