java - 如何正确地与doOnNext/doOnCompleted进行副作用同步?

标签 java android multithreading rx-java

当我得到一些Observable时它在后台线程上执行,但想要在主线程上创建和使用的当前类中执行一些副作用 - 可以在 doOnNext 中使用同步块(synchronized block)吗?保持线程安全?

即像这样的东西:

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或通过接收:

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

关于java - 如何正确地与doOnNext/doOnCompleted进行副作用同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36040465/

相关文章:

java - 使用 Mina 模拟 XMPP 服务器仅在部分时间有效

java - spring security在哪里取值来替换通配符?

c - 多进程与多线程共享的文件系统

c# - 在VS的 Debug模式下使用netcore 3.1时,线程无序地排队

安卓 onTouchListener : Switch Activity On User Touch

multithreading - PostSharp OnMethodBoundaryAspect 不是线程安全的

java - 解析 .ttl 文件并将其映射到 Java 类

java - 提取带标签的 PDF 中的阅读顺序序列

android - 将 .git 从 Linux 复制到 Windows `Changes not staged for commit`

android - 隐藏 ActionBar,保持选项卡在 Android Kitkat 中不起作用