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