android - 防止处理取消网络请求

标签 android retrofit2 rx-java2

我正在使用 RxJava2 和 Retrofit2 来处理网络请求。

我有一个循环,其中 doOnNext 应该始终运行,但是我的 Activity 是观察者,当它被销毁时调用 dispose() 并且导致改造以取消请求。

java.io.IOException: Canceled

有没有办法让请求完成但只处理 UI 级别的观察者?

mApi.doSomethingImportant()
    .doOnNext(new Consumer<ImportantResponse>() {
        @Override
        public void accept(ImportantResponse response) throws Exception {
            // Store data, should always get here if request is success
        }
    })
    .doOnError(new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {
            // Store error, should always get here if request fails
        }
    })
    .observeOn(AndroidSchedulers.mainThread())
    .unsubscribeOn(AndroidSchedulers.mainThread())
    .subscribe(observer); // observer reports success/fail on UI if not disposed

谢谢。

最佳答案

我找到了一种通过用另一种方式包裹观察者来实现所需行为的方法,但我确信有一些优雅的方法可以做到这一点。

...
.subscribe(new NonDisposableObserver<>(observer)

NonDisposableObserver 类如下:

public class NonDisposableObserver<T> implements Observer<T> {

    private DisposableObserver<T> observer;

    public NonDisposableObserver(DisposableObserver<T> observer) {
        this.observer = observer;
    }

    @Override
    public void onSubscribe(Disposable d) {
    }

    @Override
    public void onNext(T t) {
        if (!observer.isDisposed()) {
            observer.onNext(t);
        }
    }

    @Override
    public void onError(Throwable e) {
        if (!observer.isDisposed()) {
            observer.onError(e);
        }
    }

    @Override
    public void onComplete() {
        if (!observer.isDisposed()) {
            observer.onComplete();
        }
    }
}

关于android - 防止处理取消网络请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47794454/

相关文章:

android - 无法在 Android 4.2 的 appwidget 中将位图写入 parcel blob

android - Recylerview MVVM 中未显示 JSON 数据

java - 将 Observable<Single<Object>> 转换为 Single<List<Object>>

java - 过滤后,过滤器显示不正确的列表

带有 tkinter 的 android monkeyrunner python 脚本

android - 无法使自定义 DialogFragment 在 Fragment 上透明

android - 是否可以在 Android 中使用 URL 而不是 SDK 将图像上传到 firebase 存储?

java - 将变量应用于 Retrofit HTTP 方法注释

java - RxJava2 : How to wait all Flowables in a list to finish?

android - 使用RxJava将列表插入 session 室数据库