2016-03-16 28 views
1

當我得到一些Observable它在後臺線程上執行,但想要在當前類中執行一些副作用並在主線程上使用 - 是否可以使用doOnNext中的同步塊來保持線程安全?如何使用doOnNext/doOnCompleted正確執行副作用同步?

I.e.是這樣的:

class MyClass { 
    private final CustomObject information = new CustomObject(); 

    public Observable<?> func() { 
    // runs on Schedulers.io(), but I don't neccessarily know it 
    Observable<?> observable = someModule.getObservable(); 
    return observable 
     .doOnNext(v -> { 
      synchronized (this) { 
      information.saveSomething(v); 
      } 
     }); 
    } 

    public void otherFunc() { 
     synchronized (this) { 
     information.saveSomething("blah-foo-bar"); 
     } 
    } 
} 

我現在有在我的項目沒有這樣的代碼,但有時棘手的情況出現:

  • 我知道我可以.doOnNext()之前使用.observeOn(mainThread()),但這將有修改的效果整個下游,這並不總是想
  • 我剛剛意識到,另一個好的解決方案將使CustomObject()不可變(但然後final修改器將需要消失 - 是否可以?)

回答

0

如果您需要,可以做synchronization,只要記住,如果您不會將其移動到不同的線程,它會影響鏈條的下降部分。

爲你的情況的另一種可能的解決方案將是不適用observeOn(mainThread())但手工做的doOnNext()裏面要麼只是post()到主線程Handler或通過接收:

observable.doOnNext(() -> { 
    Completable 
    .fromCallable(() -> information.saveSomething(v)) 
    .subscribeOn(mainThread()) 
    .subscribe(); 
}) 
+0

哦,很好的解決方案!我一直希望找到像這樣的東西 - 基於rx,因爲一些模擬器有一些運行時在執行'View.post()'時會導致泄漏。或者類似的東西,但我記得有問題。而且它還需要傳遞'查看/上下文',通常會聞到它的味道。 – dimsuz

相關問題