我正在使用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中,就像这个例子:
那么,我是否在演示者或交互者中设置调度程序?
(我认为放入Presenter是一个更好的主意,因为Intractor的工作只是获取数据,但也许我错了......)
答案 0 :(得分:2)
如果您希望具有良好的可组合性,我建议您尽可能晚地指定调度程序(除非必要);这通常意味着在订阅之前。这样你可以重用f.e. login()
在另一个流程中,无需一直跳线。
然而,这就像我的意见......
答案 1 :(得分:0)
如果您要对演示者进行单元测试,您应该将调度程序放在交互器中,因为subscribeOn()
一个(大部分时间)与android相关(因为主线程调度程序)并且您赢了如果它内部有特定于Android的类,则能够测试你的演示者(除非你模拟调度程序)。