web-dev-qa-db-ja.com

RxJava2 DisposableをViewModelでいつ破棄するのですか?

私は ViewModel from Androidアプリのアーキテクチャコンポーネントを使用しています。ViewModelでは、 RxJava2 サブスクリプションを使用しており、Disposableオブジェクトをサブスクライブした後、以前はActivityでこれを行ったときに、DisposableonDestroy()で破棄してメモリリークを回避していました:

@Override
protected void onDestroy() {
    disposable.dispose();
    super.onDestroy();
}

いつ、どのようにViewModelに廃棄すればよいですか?実際にそれを行う必要がありますか?

12
Micer

onClearedメソッドを使用

@Override
protected void onCleared () {
    disposable.dispose();
    super.onCleared ();
}
16
Samuel Eminet

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

onPause()は、ActivityまたはFragmentが破棄された場合にのみ呼び出されるため、onDestroy()で実行する必要があります。新しいビューを追加したときにスタック上に存在し、ViewModelからデータを受信し続けることができますが、ビューが画面上にない場合はonPause()を呼び出す必要があります。

0