首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MVVM中用RxJava代替RxJava

在MVVM中用RxJava代替RxJava
EN

Stack Overflow用户
提问于 2018-06-17 08:21:25
回答 2查看 4.9K关注 0票数 0

LiveData看起来非常有用,因为它只在视图处于活动状态时通知视图。它还会在订阅后将最后一个值存储并返回给新订阅者。

我的问题是,如何用RxJava实现同样的目标?

因为Rx是一个功能齐全的反应性解决方案,将它与另一个反应性解决方案结合起来似乎是不对的。我更希望能够将LiveData从项目中删除。

我知道https://github.com/trello/RxLifecyclehttps://github.com/uber/AutoDispose,但是他们做的是从流中取消订阅。我不想这样。我希望我的流像视图模型一样存在,但是我的活动要开始和停止倾听基于生命周期的蒸汽。

如有任何建议,将不胜感激

EN

回答 2

Stack Overflow用户

发布于 2018-06-17 09:02:04

您完全可以只使用 RxJava来完成整个工作。这就是我在很多应用程序中对我的团队所做的:

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

  1. 当视图被销毁时,我们使用来自体系结构组件的ViewModel来保留ViewModel的状态
  2. 我们在View/片段中订阅ViewModel的RxJava,并在onStop/onDestroy中释放订阅。正如您所提到的,RxLifecycle实际上在那里有很大的帮助。当视图被销毁时,您不能或者更确切地说不应该保留订阅。它会造成内存泄漏,因为订阅在视图/片段上仍然有一个硬引用。此外,如果视图被破坏(例如,当服务器请求在关闭应用程序后返回时),视图模型的RxProperties就会崩溃。所以你需要释放你的订阅,这在Android中是无法避免的。

正如@Samuel所提到的,一个BehaviourSubject/PublishSubject (视情况而定)非常适合为ViewModel提供输入。这些输出将是可观察的,您可以订阅。您的ViewModel可以有一个输出和输入的接口,如下所示:

代码语言:javascript
复制
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)

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

票数 8
EN

Stack Overflow用户

发布于 2018-06-17 08:29:01

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

  • 首先,您可以使用LiveDataReactiveStreams将实时数据流转换为rx流,反之亦然。
  • 第二,您肯定可以摆脱livedata,使用BehaviourSubject (一个将最后值存储为实时数据的rx流),但正如您所说的,当您的视图恢复/暂停时,您将不得不删除/取消订阅。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50894925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档