在MVVM artitecture中使用RxJava替换LiveData

时间:2018-06-17 08:21:25

标签: android mvvm rx-java android-livedata

LiveData似乎非常有用,因为它只在视图处于活动状态时通知视图。它还会在订阅后立即将最后一个值存储并返回给新订阅者。
我的问题是如何只用RxJava实现同样的目的?

由于Rx是一种功能齐全的反应性解决方案,将其与另一种反应性溶液相结合似乎并不合适如果我可以从项目中删除LiveData,我更喜欢。

我知道https://github.com/trello/RxLifecyclehttps://github.com/uber/AutoDispose,但他们所做的是从流中取消订阅。我不希望这样。我希望我的流存在,因为视图模型还活着,但我的活动是开始和停止在生命周期中听取蒸汽基础。

任何建议将不胜感激

2 个答案:

答案 0 :(得分:3)

您可以使用2种解决方案:

  • 首先,您可以使用LiveDataReactiveStreams将liveata流转换为rx流,反之亦然。

  • 第二个你绝对可以摆脱livingata并使用BehaviourSubject(将最后一个值存储为实时数据的rx流),但正如你所说的那样,你必须在下载/取消订阅时你的观点恢复/暂停

答案 1 :(得分:3)

你绝对可以用 RxJava完成整个事情。这就是我在许多应用程序中对我的团队所做的事情:

关于生命周期管理,我们做了两件事:

  1. 我们使用架构组件中的ViewModel在View被销毁时保留ViewModel的状态https://developer.android.com/topic/libraries/architecture/viewmodel

  2. 我们在View / Fragment中订阅ViewModel的RxJava-Properties并处理订阅,例如在onStop / onDestroy中。你提到的RxLifecycle实际上对它有很大的帮助。当被销毁时,你不能或者不应该保留订阅。它会产生内存泄漏,因为订阅仍然在View / Fragment上有一个硬参考。此外,如果您的ViewModel的RxProperties在View被销毁时触发(例如,在关闭应用程序后服务器请求返回时),整个事件将会崩溃。所以你需要来处理你的订阅,在Android中没办法。

  3. 正如@Samuel所提到的,BehaviourSubject / PublishSubject(取决于具体情况)非常适合为ViewModel提供输入。输出将是您订阅的Observable。您的ViewModel可以具有输出和输入的接口,如下所示:

    interface TasksViewModel {
            // inputs
            Observer<Task> taskAddedTrigger();
            Observer<Task> taskClickedTrigger();
            Observer<Task> taskCompletedTrigger();
    
            // outputs   
            Observable<Boolean> isLoading();
            Observable<List<Task>> tasks();
    }
    

    然后,您的ViewModel只使用RxJava以非常实用的方式将输入映射到输出。只要收到用户输入,您就会将片段输入提供给ViewModel。当ViewModel的输出发生变化时,它会订阅输出并相应地更新用户界面。 Here is a compact article我总结了整个架构(MVVM + RxJava)

    如果您对此方法的任何细节遇到麻烦,请告诉我。我在许多应用程序中使用了这种架构。