【问题标题】:When to dispose RxJava2 Disposable in ViewModel?何时在 ViewModel 中处理 RxJava2 Disposable?
【发布时间】:2018-09-11 02:33:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: android viewmodel rx-java2 android-viewmodel


    【解决方案1】:

    使用 onCleared 方法

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

    【讨论】:

    • 只有当activity从back stack中弹出时才会调用这个方法。当您打开第二个活动并将第一个活动推回堆栈时,此潜在客户数据流未处理。
    • @Sergey 您的活动可能会在任何时候在后台运行时被破坏,而在大多数情况下您的活动不会被破坏,您当然不想杀死您的数据流,否则如果活动返回前台在被销毁之前,您的所有流都将被杀死,因此您的活动将与您的数据不同步
    • 我发现我必须在 2 个地方清除一次性物品:1)在上面的 oncleared 中,以及 2)在我的片段的 ondestroyview 方法中。 >> 如果我没有按照 1) 清除一次性用品,那么在离开视图和应用程序崩溃后上下文为空时会触发我的订阅者。如果我没有按照 2) 清除,那么我会遇到内存泄漏问题,例如,这会导致我的点击侦听器在返回导航后出现间歇性。
    • @RowanGontier 我从未在控制器端(片段)使用 rx,我只在控制器端使用视图模型和 livedata 的 rx,LiveDataReactiveStreams#fromPublisher 可以帮助将 rx 转换为 livedata。这样你就不需要在控制器端进行处理
    【解决方案2】:

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

    【讨论】:

    • 我实际上在做的是我在这里使用Observable.timer。你能告诉我如何将它与 LiveDataReactiveStreams 一起使用吗?这是代码:gist.github.com/micer/93b02625bd078e52c5258eabaaea4449
    • 另外,这里是如何处理旋转:stackoverflow.com/q/47382786/1916449
    • 嘿,当我们使用 LiveDataReactiveStreams 时,它会像 CompositDisposable 那样处理 Rx Observation 吗?
    • @yasin 不知道你的意思是什么,也许你可以把它作为一个单独的问题发布并详细说明一下?
    猜你喜欢
    • 2018-10-14
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多