这是 Mosby 尊重的 RxJava 的约定。
在第一个示例中,发生的情况如下:
override fun loadIntent(): Observable<Unit> {
return Observable.just(Unit)
}
然后在演示者演示者中执行以下操作:
intent(YourView::loadIntent)
loadIntent()
这基本上订阅了Observable.just(Unit)
然后在内部触发以下 RxJava 回调intent(YourView::loadIntent)
:
--> onNext(Unit)
--> onComplete()
所以你intent(YourView::loadIntent)
达到了onComplete()
状态,这意味着任何未来的排放都将被忽略(即 RxJava 合同)。所以这个意图只触发的“魔法”是因为在你的演示者中它达到了onComplete()
.
在第二个例子中:
override fun loadIntent(): Observable<Unit> {
return Observable.just(Unit).mergeWith(RxView.clicks(error).map { Unit })
}
这里要注意mergeWith()
操作符。这里的“问题”是只有在两者都和单独到达mergeWith()
时才完成(和调用onComplete()
)。虽然在前面的代码中已经讨论过 onComplete() 被剪断,但永远不会到达,这就是为什么永远不会到达,这就是为什么在 Fragment 重新创建(如屏幕方向更改)时再次触发此意图。Observable.just(Unit)
RxView.clicks(error)
onComplete
Observable.just(Unit)
RxView.clicks(error)
onComplete()
mergeWith()
onComplete()
我建议mergeWith()
在您的演示者中执行并将其拆分为两个意图:loadIntnent()
和retryLoadingOnErrorIntent()
.