使用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 })
}
为什么?
是莫斯比尊重的rxjava的合同。
在第一个示例中,发生的情况是:
override fun loadIntent(): Observable<Unit> {
return Observable.just(Unit)
}
然后在主持人演示者中您做类似的事情:
intent(YourView::loadIntent)
这基本上订阅了loadIntent()
,即Observable.just(Unit)
然后在intent(YourView::loadIntent)
中触发以下RXJAVA回调:
--> 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()
操作员。这里的"问题"是,如果Observable.just(Unit)
和RxView.clicks(error)
单独到达onComplete
,则mergeWith()
仅完成(并调用onComplete()
)。虽然Observable.just(Unit)
如前所述,但RxView.clicks(error)
从未达到onComplete()
,这就是为什么mergeWith()
永远不会到达onComplete()
的原因,这就是为什么在Fragment Recreation(例如屏幕方向更改)再次触发此意图的原因。
我建议您在主持人中执行mergeWith()
并分为两个目的:loadIntnent()
和retryLoadingOnErrorIntent()
。