之前在學習 Rxjava 的時候發現仍有部分知識點自己遺漏了,不夠嚴謹,在這裡補充多一個知識點。那就是 CompositeDisposable 類。
在用 Rxjava 配合 Retorfit 的時候,發送請求,拿到數據後我們要讓數據顯示在視圖中的時候往往會刷新頁面,但假如,我們發送請求出去的時候網絡比較差,返回數據比較慢,然後我們又手快的關閉了當前這個 Activity,那 RxJava 當拿到返回的數據的時候去刷新界面就會報空指針異常了。就是說,請求過程中,我們的 UI 層 Destroy 的時候,不及時取消訂閱,就會造成內存洩漏。這裡就要用到我們的CompositeDisposable。
使用#
使用的方法大致就是三步:
- ui 層創建的時候,實例化我們的 CompositeDisposable 類。
- 把訂閱返回的 disposable 對象加入到我們的管理器中。
- ui 層銷毀的時候清空訂閱對象。
創建 ui 的時候實例化#
@Override
public void onStart() {
if (mSubscriptions == null) {
mSubscriptions = new CompositeDisposable();
}
}
添加 disposable 對象#
netWork.getInstance().getDataService()
.translateYouDao(q,from,to,appID,salt,sign,signType,curtime)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<TranslationBean>() {
@Override
public void onSubscribe(Disposable d) {
mSubscriptions.add(d); //這裡添加到容器中
}
@Override
public void onNext(TranslationBean translationBean) {
List<TranslationBean> list_word = new ArrayList<>();
list_word.add(translationBean);
mView.showResult(list_word);
}
@Override
public void onError(Throwable e) {
mView.showConnection();
}
@Override
public void onComplete() {
}
});
ui 層銷毀時候解除訂閱#
@Override
public void onDestroy() {
if (mSubscriptions != null) {
mSubscriptions.dispose();
mSubscriptions.clear();
mSubscriptions = null;
}
}
總結#
一些細節上的地方自己沒能發現,還是得多看看別人代碼,遇到不知道用來幹嘛的類說不定就是自己忽略掉的地方。