LiveData看起来非常有用,因为它只在视图处于活动状态时通知视图。它还会在订阅后将最后一个值存储并返回给新订阅者。
我的问题是,如何用RxJava实现同样的目标?
因为Rx是一个功能齐全的反应性解决方案,将它与另一个反应性解决方案结合起来似乎是不对的。我更希望能够将LiveData从项目中删除。
我知道https://github.com/trello/RxLifecycle和https://github.com/uber/AutoDispose,但是他们做的是从流中取消订阅。我不想这样。我希望我的流像视图模型一样存在,但是我的活动要开始和停止倾听基于生命周期的蒸汽。
如有任何建议,将不胜感激
发布于 2018-06-17 09:02:04
您完全可以只使用 RxJava来完成整个工作。这就是我在很多应用程序中对我的团队所做的:
关于生命周期管理,我们做两件事:
正如@Samuel所提到的,一个BehaviourSubject/PublishSubject (视情况而定)非常适合为ViewModel提供输入。这些输出将是可观察的,您可以订阅。您的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的输出发生变化时,它将订阅输出并相应地更新用户界面。这是一篇紧凑的文章,我在这里总结了整个体系结构(MVVM+RxJava)
如果你遇到这种方法的任何细节问题,请告诉我。我在很多应用程序中都使用了这种架构。
发布于 2018-06-17 08:29:01
您可以使用2种解决方案:
LiveDataReactiveStreams将实时数据流转换为rx流,反之亦然。BehaviourSubject (一个将最后值存储为实时数据的rx流),但正如您所说的,当您的视图恢复/暂停时,您将不得不删除/取消订阅。https://stackoverflow.com/questions/50894925
复制相似问题