使用mosby-mvi时,
以下代码可以正常工作-创建片段时仅触发一次。
override fun loadIntent(): Observable<Unit> {
return Observable.just(Unit)
}
以下代码无法正常工作-每当活动从后台唤醒时都会触发。
override fun loadIntent(): Observable<Unit> {
return Observable.just(Unit).mergeWith(RxView.clicks(error).map { Unit })
}
那是为什么?
答案 0 :(得分:0)
那是Mosby尊重的RxJava合同。
在第一个示例中,将发生以下情况:
override fun loadIntent(): Observable<Unit> {
return Observable.just(Unit)
}
然后在演示者演示者中执行以下操作:
intent(YourView::loadIntent)
这基本上订阅了loadIntent()
的{{1}}
然后在Observable.just(Unit)
内部触发以下RxJava回调:
intent(YourView::loadIntent)
因此,您的--> onNext(Unit)
--> onComplete()
达到了intent(YourView::loadIntent)
状态,这意味着将来任何排放都将被忽略(这是RxJava合同)。
因此,仅触发此意图的“魔术”是因为在您的演示者中它达到了onComplete()
。
在第二个示例中:
onComplete()
这里override fun loadIntent(): Observable<Unit> {
return Observable.just(Unit).mergeWith(RxView.clicks(error).map { Unit })
}
运算符要注意的事情。这里的“问题”是,只有mergeWith()
和mergeWith()
分别达到onComplete()
时Observable.just(Unit)
才完成(并调用RxView.clicks(error)
)。尽管onComplete
到达了onComplete(),如先前的代码片段中已讨论的那样,但Observable.just(Unit)
从未到达RxView.clicks(error)
,这就是onComplete()
从未到达mergeWith()
的原因,这就是为什么在碎片重新播放(如屏幕方向更改)时会再次触发此意图。
我建议在您的演示者中进行onComplete()
并将其分为两个意图:mergeWith()
和loadIntnent()
。