如何使用doOnNext / doOnCompleted正确执行副作用同步?

时间:2016-03-16 15:42:33

标签: java android multithreading rx-java

当我得到一些Observable在后​​台线程上执行但想要在主线程上创建和使用的当前类中执行一些副作用时 - 可以在{{1}中使用synchronized块保持线程安全?

即。像这样的东西:

doOnNext

我目前在我的项目中没有这样的代码,但有时会出现棘手的情况:

  • 我知道我可以在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"); } } } 之前使用.observeOn(mainThread()),但是这会产生修改整个下游的效果,这并不总是需要
  • 我刚刚意识到另一个好的解决方案是使CustomObject()不可变(但是.doOnNext()修饰符需要消失 - 它可以吗?)

1 个答案:

答案 0 :(得分:0)

如果您需要,可以synchronization,但请记住,如果您不想将其移至不同的线程,它会影响链条的下行部分

您的案例的另一个可能的解决方案是不应用observeOn(mainThread()),而是在doOnNext()内手动执行,只需post()到主线程Handler或通过Rx:< / p>

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