这是 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)onCompleteObservable.just(Unit)RxView.clicks(error)onComplete()mergeWith()onComplete()
我建议mergeWith()在您的演示者中执行并将其拆分为两个意图:loadIntnent()和retryLoadingOnErrorIntent().