Magren

Magren

Idealist & Garbage maker 🛸
twitter
jike

RxJavaのCompositeDisposable

以前、Rxjava の学習中に、自分がいくつかの知識を見落としていることに気付きました。不十分であるということです。ここで、もう 1 つの知識を補完します。それは CompositeDisposable クラスです。

Rxjava を Retorfit と組み合わせて使用する場合、リクエストを送信し、データを取得した後、データをビューに表示するためには、通常、ページを更新する必要があります。しかし、もしも、リクエストを送信する際にネットワークが遅い場合、データの返却が遅い場合、そして私たちが現在の Activity を早く閉じてしまった場合、RxJava はデータを受け取った時に画面を更新しようとすると、ヌルポインタ例外が発生します。つまり、リクエストの途中で UI レイヤーが破棄された場合、サブスクリプションを適切にキャンセルしないと、メモリリークが発生します。ここで、私たちのCompositeDisposableが必要になります。

使用法#

使用方法は大まかに 3 つのステップです:

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

結論#

いくつかの細かい点に気付かず、他の人のコードをもっと見る必要があると感じました。自分が何のためのクラスかわからない場合、それは自分が見落としている可能性があります。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。