Rxjava の学習中に、自分がいくつかの知識を見落としていることに気付きました。不十分であるため、ここでもう 1 つの知識を補完します。それは CompositeDisposable クラスです。
Rxjava を Retorfit と組み合わせて使用する場合、リクエストを送信し、データを取得した後、データをビューに表示するためにしばしばページを更新する必要があります。しかし、もしリクエストを送信する際にネットワークが遅い場合やデータの取得が遅い場合、そして私たちが現在のアクティビティを早く閉じてしまった場合、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;
}
}
結論#
いくつかの細かい点に気づけなかったので、他の人のコードをもっと見る必要があります。わからないクラスが何に使用されるかわからない場合、それは自分が見落としている可能性があります。