Rez*_*adi 0 android mvvm rx-java android-livedata
LiveData似乎非常有用,因为它只在视图处于活动状态时通知视图。它还在订阅后立即存储并返回最后一个值给新订阅者。
我的问题是如何仅使用 RxJava 实现相同的功能?
由于 Rx 是一个功能齐全的反应式解决方案,将它与另一个反应式解决方案结合起来似乎不太对。我更喜欢是否可以从项目中删除 LiveData。
我知道https://github.com/trello/RxLifecycle和https://github.com/uber/AutoDispose但他们所做的是取消订阅流。我不想要那个。只要视图模型还活着,我就希望我的流存在,但我的活动会根据生命周期开始和停止收听 Steam。
任何建议将不胜感激
你绝对可以只用RxJava完成整个事情。这就是我和我的团队在许多应用程序中所做的:
关于生命周期管理,我们做两件事:
当视图被破坏时,我们使用架构组件中的 ViewModel 来保留 ViewModel 的状态 https://developer.android.com/topic/libraries/architecture/viewmodel
我们在 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)
如果您遇到此方法的任何细节问题,请告诉我。我在许多应用程序中使用了这种架构。
| 归档时间: |
|
| 查看次数: |
4506 次 |
| 最近记录: |