我的目标是一种将执行网络调用的方法,除非网络调用已经在进行中,在这种情况下,调用者订阅现有调用的结果。
这是我所拥有的,它大部分都有效:
private AsyncSubject<Stuff> asyncSubject;
public Observable<Stuff> getStuff() {
if (asyncSubject == null) {
asyncSubject = AsyncSubject.create();
asyncSubject
.doAfterTerminate(new Action() {
@Override
public void run() throws Exception {
asyncSubject = null;
}
})
.subscribe();
retrofitApi.getStuff()
.subscribe(asyncSubject);
}
return asyncSubject
.someOperatorsHere();
}
这主要是因为 asyncSubject 在终止时将自身置空,以便任何后续调用都将重新执行网络请求。
但是有一个错误,if (asyncSubject == null)
和 return asyncSubject
之间有一个窗口,doAfterTerminate 可以在其中执行,我得到一个空指针。
关于如何修复错误的任何想法。也许有更优雅的 Rx 方式来做到这一点?或者 synchronized
block 。或者查询 Retrofit 网络进度的方法。
最佳答案
此解决方案在正在进行的订阅者之间共享订阅。
private Observable<Stuff> stuff = retrofitApi.getStuff().share();
public Observable<Stuff> getStuff() {
return stuff
.someOperatorsHere();
}
关于java - 如果仍在使用 RxJava 2,则不要重新执行 Retrofit 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44401723/