java - 如果仍在使用 RxJava 2,则不要重新执行 Retrofit 调用

标签 java android retrofit rx-java

我的目标是一种将执行网络调用的方法,除非网络调用已经在进行中,在这种情况下,调用者订阅现有调用的结果。

这是我所拥有的,它大部分都有效:

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/

相关文章:

java - 我如何从对象中获取哈希值/md5?

android - 错误 : package android. hardware.camera2 不存在 OpenCV

Android Retrofit - 如何覆盖 baseUrl

android - session Cookie 在 Retrofit Android 中不持久

android - Recyclerview 只显示一个数组

java - 如何在SharedPreferences中保存Arraylist和表格?

java - ArrayList - 清除列表还是重新初始化它更好?

java - 将 .equals() 替换为 Objects.equals()

android - 通过反向地理编码检测当前地址时抛出实例化异常

android - 在 Android 中安排一周中的某些天的任务