RxJava2取消订阅

Retrofit2 + OkHttp + Rxjava2 在 Android 中无疑是一个最好的搭配,然而最近项目中遇到一个问题,在网络请求进行中,并且 Activity 关闭后,会出现如下异常

  • Caused by: java.lang.IllegalStateException: Fragment xxxxFragment{xxxx} not attached to Activity

原因的话如异常所示,所以分析之后最终想在关闭界面的时候取消调 RxJava2 的订阅

在 Observer ,其源码如下

public interface Observer {

    void onSubscribe(@NonNull Disposable d);

    void onNext(@NonNull T t);

    void onError(@NonNull Throwable e);

    void onComplete();

发现 onSubscribe 中参数 Disposable,当 Observer (观察者)与 Observable (被观察者)通过 subscribe() 建立连接后,事件可以进行传递。当发生一些其他情况,不得不断开两者之间的连接时,该怎么操作?这个时候就该 Disposable 上场了。

public interface Disposable {
    
    void dispose();

    boolean isDisposed();
}

其中有个 dispose() 的方法,通过此方法切断 Observer 与 Observable 的连接。

Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(@NonNull ObservableEmitter e) throws Exception {

            }
        }).observeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        d.dispose();//实现断开Observer 与 Observable 的连接
                    }

                    @Override
                    public void onNext(@NonNull String s) {
                        Log.i("Msg:", s);
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });

你可能感兴趣的:(RxJava2取消订阅)