【问题标题】:Replace LiveData with RxJava in MVVM artitecture在 MVVM 架构中用 RxJava 替换 LiveData
【发布时间】:2018-11-26 10:35:25
【问题描述】:

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

由于 Rx 是一个功能齐全的反应式解决方案,将它与另一个反应式解决方案结合起来似乎并不正确。如果我可以从项目中删除 LiveData,我更喜欢。

我知道https://github.com/trello/RxLifecyclehttps://github.com/uber/AutoDispose,但他们所做的是取消订阅流。我不想要那个。只要视图模型还活着,我希望我的流存在,但我的活动会根据生命周期开始和停止收听 Steam。

任何建议将不胜感激

【问题讨论】:

    标签: android mvvm rx-java android-livedata


    【解决方案1】:

    您绝对可以使用 RxJava 完成所有工作。这就是我在许多应用中与我的团队所做的:

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

    1. 当视图被销毁时,我们使用架构组件中的视图模型来保留视图模型的状态https://developer.android.com/topic/libraries/architecture/viewmodel

    2. 我们在 View/Fragment 中订阅 ViewModel 的 RxJava-Properties 并处置订阅,例如在 onStop/onDestroy 中。你提到的 RxLifecycle 实际上在那里有很大的帮助。当视图被销毁时,您不能或者更确切地说不应该保留订阅。它会造成内存泄漏,因为订阅仍然对您的视图/片段有硬引用。此外,如果 ViewModel 的 RxProperties 在 View 被销毁时触发(例如,当关闭应用程序后服务器请求返回时),整个事情都会崩溃。所以你需要处理你的订阅,在 Android 中没有办法。

    正如@Samuel 提到的,BehaviourSubject/PublishSubject(视情况而定)非常适合为 ViewModel 提供输入。输出将是您订阅的 Observables。你的 ViewModel 可以有这样的输出和输入接口:

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

    然后,您的 ViewModel 只需使用 RxJava 以非常实用的方式将输入映射到输出。每当收到用户输入时,您的 Fragment 都会向 ViewModel 提供输入。它订阅输出并在 ViewModel 的输出更改时相应地更新用户界面。 Here is a compact article 我总结了整个架构(MVVM+RxJava)

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

    【讨论】:

    • 能否请您检查一下我添加到 Samuel 答案中的评论?
    【解决方案2】:

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

    • 第一个您可以使用 LiveDataReactiveStreams 将 livedata 流转换为 rx 流,反之亦然。

    • 第二个你可能肯定会摆脱 livedata 并使用BehaviourSubject(将最后一个值存储为实时数据的 rx 流),但正如你所说,当你的视图恢复时你必须订阅/取消订阅/暂停

    【讨论】:

    • BehaviourSubject 正是我想要的。只有一件事,我的存储库层返回可观察或可流动的视图模型。如何将它们转换为 BehaviourSubject?
    猜你喜欢
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多