0

我有一些视图状态,例如StartingGameGameStarted。如果用户开始游戏,我会一个接一个地发出两种状态,并在第一个事件中开始一个进度,如下所示:

var d = Observable.interval(1000L, TimeUnit.MILLISECONDS)
            .takeWhile({ t -> t <= 45 })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe {
                 // update a progress view that shows the remaining time of this turn...
            }

旋转后,我的视图状态说,它已经处理了动画的开始,所以动画没有显示。

我怎么能以 mvi 的方式解决这个问题?

我真的应该通过 mvi 状态流发出所有这些事件,并增加每个事件的状态进度并在那里更新视图吗?

4

1 回答 1

0

我真的应该通过 mvi 状态流发出所有这些事件,并增加每个事件的状态进度并在那里更新视图吗?

是的你应该。这样做是有意义的,并使您的应用程序更具可测试性。

您知道进度正确运行了多长时间(4500 毫秒)。你可以把这部分变成状态

state = {
   ...
   animationRun = 90 ms,
   totalAnimationTime = 4500 ms
}

并且在您的Observable.interval()流中,您基本上会增加 animationRun.

然后执行以下操作:

  1. 您的屏幕开始于:

    状态 = { ... animationRun = 0 毫秒,totalAnimationTime = 4500 毫秒 }

    开始一个 4500 毫秒的动画

  2. 旋转屏幕后:你知道最后的状态像

    状态 = { ... animationRun = 1000 毫秒,totalAnimationTime = 4500 毫秒 }

    然后你知道你的动画必须以进度“1000”开始并运行3500ms(3500 + 1000 = 4500)

于 2018-04-10T08:46:34.317 回答