如何避免每次碎片启动时每次发射loadIntent()



使用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()

最新更新