gpt4 book ai didi

android - 在 MVVM 架构中用 RxJava 替换 LiveData

转载 作者:行者123 更新时间:2023-12-03 10:52:06 25 4
gpt4 key购买 nike

LiveData似乎非常有用,因为它仅在 View 处于 Activity 状态时通知 View 。它还在订阅后立即存储最后一个值并将其返回给新订阅者。

我的问题是如何仅使用 RxJava 实现相同的目标?

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

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

任何建议将不胜感激

最佳答案

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

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

  • 当 View 被销毁时,我们使用架构组件中的 View 模型来保留 View 模型的状态https://developer.android.com/topic/libraries/architecture/viewmodel
  • 我们在 View/Fragment 中订阅 ViewModel 的 RxJava-Properties 并处理订阅,例如在 onStop/onDestroy 中。你提到的 RxLifecycle 实际上在那里有很大的帮助。当 View 被销毁时,您不能或不应该保留订阅。它会造成内存泄漏,因为订阅仍然对您的 View /fragment 有硬引用。此外,如果 ViewModel 的 RxProperties 在 View 被销毁时触发(例如,当关闭应用程序后服务器请求返回时),整个事情都会崩溃。所以你需要处理你的订阅,这在 Android 中是没有办法的。

  • 正如@Samuel 提到的那样,BehaviourSubject/PublishSubject(视情况而定)非常适合为 ViewModel 提供输入。输出将是您订阅的 Observables。你的 ViewModel 可以有一个输出和输入的接口(interface),如下所示:
    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)

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

    关于android - 在 MVVM 架构中用 RxJava 替换 LiveData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50894925/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com