当我得到一些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())
,但是这会产生修改整个下游的效果,这并不总是需要.doOnNext()
修饰符需要消失 - 它可以吗?)答案 0 :(得分:0)
如果您需要,可以synchronization
,但请记住,如果您不想将其移至不同的线程,它会影响链条的下行部分
您的案例的另一个可能的解决方案是不应用observeOn(mainThread())
,而是在doOnNext()
内手动执行,只需post()
到主线程Handler
或通过Rx:< / p>
observable.doOnNext(() -> {
Completable
.fromCallable(() -> information.saveSomething(v))
.subscribeOn(mainThread())
.subscribe();
})