0

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

这是为什么?

4

1 回答 1

0

这是 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().

于 2019-01-29T13:57:10.543 回答