Retrofit2 + OkHttp + Rxjava2 在 Android 中無(wú)疑是一個(gè)最好的搭配,然而最近項(xiàng)目中遇到一個(gè)問(wèn)題辛藻,在網(wǎng)絡(luò)請(qǐng)求進(jìn)行中,并且 Activity 關(guān)閉后互订,會(huì)出現(xiàn)如下異常
- Caused by: java.lang.IllegalStateException: Fragment xxxxFragment{xxxx} not attached to Activity
原因的話(huà)如異常所示吱肌,所以分析之后最終想在關(guān)閉界面的時(shí)候取消調(diào) RxJava2 的訂閱
在 Observer<T> ,其源碼如下
public interface Observer<T> {
void onSubscribe(@NonNull Disposable d);
void onNext(@NonNull T t);
void onError(@NonNull Throwable e);
void onComplete();
發(fā)現(xiàn) onSubscribe 中參數(shù) Disposable仰禽,當(dāng) Observer (觀察者)與 Observable (被觀察者)通過(guò) subscribe() 建立連接后氮墨,事件可以進(jìn)行傳遞。當(dāng)發(fā)生一些其他情況吐葵,不得不斷開(kāi)兩者之間的連接時(shí)勇边,該怎么操作?這個(gè)時(shí)候就該 Disposable 上場(chǎng)了。
public interface Disposable {
void dispose();
boolean isDisposed();
}
其中有個(gè) dispose() 的方法折联,通過(guò)此方法切斷 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();//實(shí)現(xiàn)斷開(kāi)Observer 與 Observable 的連接
}
@Override
public void onNext(@NonNull String s) {
Log.i("Msg:", s);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});