MVP + RxJava - 把调度器放在Presenter中还是Interactor中?

4
我正在使用MVP和RxJava开发Android应用程序。好的,我有一个疑问:
当我创建我的Presenter和Interactor时,我可以将Schedulers放在Presenter中,就像这样:
Presenter中的Schedulers
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()

或者我可以在Interactor中设置Schedulers,像这样:
在Interactor中设置Schedulers
Presenter:
 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())

我看到谷歌建议在Interactor中设置Schedulers。您可以在此链接中查看: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中设置Schedulers?
(我认为将其放在Presenter中更好,因为Interactor的工作只是获取数据,但也许我错了...)
2个回答

2
如果您想要良好的可组合性,我建议您尽可能晚地指定调度程序(除非必要);通常是在订阅之前。这样,您可以在另一个流程中重用例如login()而无需一直进行线程跳转。
然而,这只是我的个人意见...

0

如果您要对Presenter进行单元测试,则应该将调度程序放在Interactor中,因为subscribeOn()通常与Android相关(因为主线程调度程序),如果它的内部有特定于Android的类,您将无法测试您的Presenter(除非模拟调度程序)。


1
我可以创建一个调度程序提供程序并通过依赖注入在Presenter中进行模拟。您可以在此存储库中查看一个不错的示例: https://github.com/googlesamples/android-architecture/tree/todo-mvp-rxjava - Leandro Borges Ferreira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接