如何避免在片段启动时每次触发loadIntent()

时间:2018-12-19 04:06:29

标签: mosby

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

那是为什么?

1 个答案:

答案 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()