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

时间:2017-01-14 01:58:18

标签: android architecture rx-java kotlin mvp

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

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

演示者中的计划程序

主讲人:

 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建议在Interactor中设置调度程序。您可以在此链接中看到:

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是一个更好的主意,因为Intractor的工作只是获取数据,但也许我错了......)

2 个答案:

答案 0 :(得分:2)

如果您希望具有良好的可组合性,我建议您尽可能晚地指定调度程序(除非必要);这通常意味着在订阅之前。这样你可以重用f.e. login()在另一个流程中,无需一直跳线。

然而,这就像我的意见......

答案 1 :(得分:0)

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