android - MVP with interactor and repository + rxjava 2. 在哪里调用 observeOn 和 subscribeOn

标签 android rx-java2 mvp clean-architecture

我有一个基于 MVP + 交互器 + 存储库的 Android 应用程序。从存储库到呈现器的所有层都使用 react 流 (RxJava 2) 连接。查看向演示者请求某些内容,演示者向交互者请求,交互者向存储库请求,存储库向 API 本身请求。响应通过与 react 流相同的层从 API 传递到呈现器。每一层都可以为底层映射数据。

问题是。我应该在哪里调用 subscribeOn(io()/computation()/etc) 和 observeOn(AndroidSchedulers.mainThread()) ? 我认为应该从演示者调用 observeOn(AndroidSchedulers.mainThread()) 因为繁重的计算可以在交互器中执行。 在许多示例中,presenter 调用了 subscribeOn(io()/computation()/etc),但我不同意这种方法。我认为演示者不应该决定在哪个线程中加载数据。存储库应决定在哪个线程中从 API 加载数据。 例如,如果我们有存储库接口(interface)来加载联系人。一个实现可以从数据库或互联网或内存存储中获取数据。无需为内存存储库创建线程。所以存储库应该决定是否订阅 io/computation/etc 调度器。

有什么想法吗?

最佳答案

我不会在存储库层调用 subscribeOn()observeOn(),原因如下:

  • 在不同线程上隐式执行的方法很难使用,并且可能会导致调用它们的客户端出现问题。
  • 如果您想组合来自不同存储库的多个流,控制它们会更方便。如果它们在不同的线程上订阅,这可能会导致细微的错误、达不到最佳性能和难以阅读代码。
  • 这给 repo 层增加了另一个责任。存储库不再是简单的数据存储,现在可以感知线程。在我看来,这违反了单一职责原则。

我通常在 View 之前的最后一层调用 subscribeOn()observeOn() - 在这种情况下,这将是您的展示层。在那里,我可以完全控制交互器的组成,并更好地判断我想在何处处理事物以及在何处需要处理结果。

关于android - MVP with interactor and repository + rxjava 2. 在哪里调用 observeOn 和 subscribeOn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54372485/

相关文章:

angularjs - 如何为不同的项目版本和管理 angularjs 组件

java - 不在android studio中显示styles.xml

java - 获取星期几不使用日历

android - Build.Gradle(Module App)未知属性

android - 如何解决错误 : "Not sure how to handle insert method' s return type"in implement room with RX java

android - MVP:管理 Activity 和 fragment 的最佳实践

android - 通话相互重叠

java - 找不到封闭方法 'void lambda$getTestFlowable$0(io.reactivex.FlowableEmitter)'

android-studio - 相同的值作为 nextKey 在从 Paging Library 3 Android 中的 PagingSource 加载的两个连续页面中传递

c# - 如何将对象集合绑定(bind)到 Winforms 中的 DataGridView