何时在ViewModel中部署RxJava2 Disposable?

时间:2018-04-01 19:14:00

标签: android viewmodel rx-java2 android-viewmodel

我在我的应用中使用Android架构组件中的ViewModel。在ViewModel中,我使用RxJava2订阅,并在订阅后保留Disposable对象。之前,当我在Activity中执行此操作时,我习惯于在Disposable中处理onDestroy() - 以避免内存泄漏:

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

何时以及如何在ViewModel处理它?我真的需要这样做吗?

3 个答案:

答案 0 :(得分:14)

使用onCleared方法

apply

答案 1 :(得分:1)

您可以使用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;
    }
}

答案 2 :(得分:0)

您应该在@Override protected void onCleared () { disposable.dispose(); super.onCleared (); } 中执行此操作,因为只有在onPause()onDestroy()被销毁时才会调用Activity。当您向其添加新视图并继续从Fragment接收数据时,它可以在堆栈上生效,但是当屏幕上没有视图时,应调用ViewModel