私は ViewModel from Androidアプリのアーキテクチャコンポーネントを使用しています。ViewModelでは、 RxJava2 サブスクリプションを使用しており、Disposable
オブジェクトをサブスクライブした後、以前はActivity
でこれを行ったときに、Disposable
をonDestroy()
で破棄してメモリリークを回避していました:
@Override
protected void onDestroy() {
disposable.dispose();
super.onDestroy();
}
いつ、どのようにViewModel
に廃棄すればよいですか?実際にそれを行う必要がありますか?
onClearedメソッドを使用
@Override
protected void onCleared () {
disposable.dispose();
super.onCleared ();
}
LiveDataReactiveStreams#fromPublisher(Publisher<T>)
を使用して、ビューモデルでサブスクライブして破棄する代わりに、ビューモデルから結果のLiveData
を公開できます。
例えば:
public class ExampleViewModel {
private static final long TIME_FOR_ANSWER = 1000;
private static final long DELAY = 25;
private final LiveData<Long> remainingTime;
ExampleViewModel() {
long start = 0;
long count = TIME_FOR_ANSWER / DELAY + 1;
Flowable<Long> flowable =
Flowable.intervalRange(start, count, 0, DELAY, TimeUnit.MILLISECONDS)
.map(i -> TIME_FOR_ANSWER - DELAY * i);
remainingTime = LiveDataReactiveStreams.fromPublisher(flowable);
}
public LiveData<Long> getRemainingTime() {
return remainingTime;
}
}
onPause()
は、Activity
またはFragment
が破棄された場合にのみ呼び出されるため、onDestroy()
で実行する必要があります。新しいビューを追加したときにスタック上に存在し、ViewModel
からデータを受信し続けることができますが、ビューが画面上にない場合はonPause()
を呼び出す必要があります。