当我得到一些在后台线程上执行的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();
})