以前、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;
}
}
結論#
いくつかの細かい点に気付かず、他の人のコードをもっと見る必要があると感じました。自分が何のためのクラスかわからない場合、それは自分が見落としている可能性があります。