RxJava2取消订阅
2018-01-25 本文已影响0人
tao_sx
Retrofit2 + OkHttp + Rxjava2 在 Android 中无疑是一个最好的搭配,然而最近项目中遇到一个问题,在网络请求进行中,并且 Activity 关闭后,会出现如下异常
- Caused by: java.lang.IllegalStateException: Fragment xxxxFragment{xxxx} not attached to Activity
原因的话如异常所示,所以分析之后最终想在关闭界面的时候取消调 RxJava2 的订阅
在 Observer<T> ,其源码如下
public interface Observer<T> {
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<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
}
}).observeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@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() {
}
});