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;
        }
    }

总结#

一些细节上的地方自己没能发现,还是得多看看别人代码,遇到不知道用来干嘛的类说不定就是自己忽略掉的地方。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。