MVP + RxJava - 将调度器放在 Presenter 或 Interactor 中?

MVP + RxJava - Put the Schedulers in the Presenter or in the Interactor?

我正在使用 MVP 和 RxJava 开发 Android 应用程序。好吧,我有一个疑问:

当我创建演示者和交互器时,我可以将调度程序放入演示者中,如下所示:

Presenter 中的调度程序

主持人:

 override fun tryLogin(username: String, password: String) {
                mLoginInteractor.login(username, password)
                        .subscribeOn(Schedulers.newThread())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(object : Subscriber<User>(){
        [...]
        }

登录交互者:

override fun login(username: String, password: String) =
 mRetrofit.create(ApiClient::class.java).login()

或者我可以在交互器中设置调度程序,如下所示:

交互器中的调度程序

主持人:

 override fun tryLogin(username: String, password: String) {
                mLoginInteractor.login(username, password)
                        .subscribe(object : Subscriber<User>(){
        [...]
        }

登录交互者:

    override fun login(username: String, password: String) =
     mRetrofit.create(ApiClient::class.java).login()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())

我看到 Google 建议在交互器中设置调度程序。你可以在这个 link:

中看到

https://github.com/googlesamples/android-architecture/tree/todo-mvp-rxjava/

但是很多人把代码放在Presenter里面,像这个例子:

https://github.com/BoydHogerheijde/Android-MVP-example/blob/master/app/src/main/java/nl/bhogerheijde/example/rxmvp/interactor/Interactor.java

那么,我是在 Presenter 中还是在 Interactor 中设置调度程序

(我认为放入 Presenter 更好,因为 Intractor 的工作只是获取数据,但也许我错了...)

如果你想有好的可组合性,我建议你尽可能晚地指定你的调度器(除非必要);这通常意味着在订阅之前。这样你就可以重用f.e。 login() 在另一个流程中,而不必一直 thread-hop。

不过,这就像,只是我的看法...

如果您要对演示者进行单元测试,您可能应该将调度程序放在交互器中,因为 subscribeOn() 一个(大部分时间)与 android 相关(因为主要thread scheduler) 并且你将无法测试你的演示者(除非你模拟调度程序)如果它有 android 特定的 类 里面。