0
我試圖實現與RxJava以下邏輯:執行請求或訂閱結果與RxJava
- 執行服務器發出請求,如果我沒有價值本地
- 結果提供給用戶
- 如果請求正在運行,請不要創建第二個請求,但請訂閱運行請求的結果。
下面的解決方案部分地解決了這個問題:
private final ExecutorService executor = Executors.newSingleThreadExecutor();
private Observable<T> getValue(){
if(storage.getValue() == null) {
Future<T> futureValue = executor.submit(new Callable<T>() {
@Override
public T call() throws Exception {
return getValueFromStorageOrBackend();
}
});
return Observable.from(futureValue);
} else {
return Observable.just(storage.getValue());
}
}
private String getValueFromStorageOrBackend() {
final String currentValue = storage.getValue();
if (currentValue == null) {
Response response = backend.requestValue();
storage.setValue(response.getValue());
return response.getValue();
}
return currentValue;
}
對此有一個優雅的純RxJava解決方案?
在'只是(1)'我會返回我的儲值。在map()中,我將檢查這個值是否爲null,並在需要時執行請求。這是對的嗎?什麼保證請求只執行一次? – Zzokk
爲什麼在第一個例子中有一個無限循環? – Zzokk
這是一個CAS循環,以防併發調用者得到()並且只有一個人應該觸發後臺計算。這裏有一個'返回'。由於狀態改變,循環在退出前最多執行兩次。 – akarnokd