在 MVVM 架构中用 RxJava 替换 LiveData

Rez*_*adi 0 android mvvm rx-java android-livedata

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

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

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

任何建议将不胜感激

Mal*_*lte 8

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

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

  1. 当视图被破坏时,我们使用架构组件中的 ViewModel 来保留 ViewModel 的状态 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();
}
Run Code Online (Sandbox Code Playgroud)

然后,您的 ViewModel 仅使用 RxJava 以非常实用的风格将输入映射到输出。每当收到用户输入时,您的 Fragment 都会向 ViewModel 提供输入。它订阅输出并在 ViewModel 的输出更改时相应地更新用户界面。 这是一篇紧凑的文章,我总结了整个架构(MVVM + RxJava)

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