gpt4 book ai didi

java - 使用 RxJava 执行请求或订阅结果

转载 作者:行者123 更新时间:2023-12-01 11:02:15 24 4
gpt4 key购买 nike

我正在尝试使用 RxJava 实现以下逻辑:

  1. 如果我本地没有值,则执行服务器请求
  2. 向订阅者提供结果
  3. 如果请求正在运行,请勿创建第二个请求,而是订阅正在运行的请求的结果。

以下解决方案部分解决了该问题:

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 解决方案?

最佳答案

更简单的方法之一是通过 AsyncSubject + 比较和设置循环:

final AtomicReference<AsyncSubject<T>> subjectRef = new AtomicReference<>();

public Observable<T> get() {
for (;;) {
AsyncSubject<T> subject = subjectRef.get();
if (subject != null) {
return subject;
}
AsyncSubject<T> next = AsyncSubject.create();
if (subjectRef.compareAndSet(null, next)) {
Observable.just(1).map(ignored -> {
// your computation here
return 2; // the result
}).subscribeOn(Schedulers.io()).subscribe(subject);
return;
}
}
}

我差点忘了,更简单的方法是使用缓存:

Observable
.just(1)
.subscribeOn(Schedulers.io())
.map(ignored -> {
// computation here
return 2;
}).cache();

关于java - 使用 RxJava 执行请求或订阅结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33241262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com