我正在查看是否有一种方法可以从Observable同步返回一个缓存值,否则可能需要很长时间才能发出。当然,如果它需要执行它的io /计算,那么它应该在计算线程上执行它,但是如果它已经在之前完成了,那么它应该是同步的并且避免在线程之间来回跳转。下面是我的意思了一些示例代码:RxJava:同步/立即返回一个缓存的值
public void bind(ItemViewHolder holder) {
getCalculationObservable()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(value -> {
holder.showValue(value); // This will happen after bind has finished
}
});
}
public Observable<Integer> getCalculationObservable() {
if (mObservable == null) {
mObservable = Observable.fromCallable(this::calculate)
.subscribeOn(Schedulers.computation())
.cache();
}
return mObservable;
}
public int calculate() throws InterruptedException {
Thread.sleep(1000);
return mValue * 1000;
}
编辑:说明什么我谈论:
void onRunSchedulerExampleButtonClicked() throws InterruptedException {
Observable<Integer> observable = Observable
.fromCallable(this::calculate)
.subscribeOn(Schedulers.computation())
.cache();
observable
.doOnNext(value -> {
Log.e("log", "first onNext()");
})
.test().await();
observable
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(value -> {
Log.e("log", "second onNext()");
})
.test().await();
Log.e("log", "this is first.");
}
结果:
E/log: onClick
E/log: first onNext()
E/log: this is first.
E/log: second onNext()
为了进一步说明这一点,如果你在第二个onNext链上添加一个await(),你将永远不会完成它,因为它将等待在你阻塞的同一个线程中排队的东西。
使用'BehaviourSubject'作为:订阅客户主题,并在内部使您的可观察推送项目进入该主题。这就是你可以如何执行后台线程和排放(主线程上的缓存/新值)。 – Than