Magren

Magren

Idealist & Garbage maker 🛸
twitter
jike

RxJava的CompositeDisposable

之前在學習 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;
        }
    }

總結#

一些細節上的地方自己沒能發現,還是得多看看別人代碼,遇到不知道用來幹嘛的類說不定就是自己忽略掉的地方。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。