具有交互器和存储库+ rxjava的MVP 2.在何处调用observeOn和subscribeOn

时间:2019-01-25 20:43:40

标签: android rx-java2 mvp clean-architecture

我有一个基于MVP +交互器+存储库的Android应用。使用响应流(RxJava 2)连接从存储库到演示者的所有层。视图向演示者请求一些内容,演示者向交互者询问,交互者从存储库询问,而存储库从API本身询问。响应通过与API到演示者的响应流相同的层。每层都可以为基础层映射数据。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

由于以下原因,我不会在存储库层中调用subscribeOn()observeOn()

  • 在不同线程上隐式执行的方法很难使用,并且可能在调用它们的客户端中引起问题。
  • 如果要组合来自不同存储库的多个流,则对其进行控制会更方便。如果它们在不同的线程上订阅,则可能会导致细微的错误,无法达到最佳性能并且难以阅读代码。
  • 这给仓库层增加了另一个责任。现在,存储库不再是简单的数据存储,而是意识到了线程。我认为,这违反了单一责任原则。

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