我正在查看是否有一種方法可以從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