我有一个基于 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/