当我得到一些在后台线程上执行的Observable但要在创建并在主线程上使用的当前类中执行一些副作用时-是否可以在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())之前使用.doOnNext(),但这将具有修改整个下游的效果,这并非总是需要的
我刚刚意识到,另一个好的解决方案是使CustomObject()不可变(但随后必须删除final修饰符-可以吗?)

最佳答案

如果需要的话,可以做synchronization,只是要记住,如果不将其移至其他线程,它将影响链的性能下降。

针对您的情况的另一种可能的解决方案是不应用observeOn(mainThread()),而是在doOnNext()内部手动完成此操作,只需将post()应用于主线程Handler或通过Rx:

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

07-24 19:49