gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:10:33 25 4
gpt4 key购买 nike

当我得到一些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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com