我有一个测试LiveData,每2秒发出一次项目。我将其转换为流,然后对其调用take(3).toList()。
val list = newLiveData
.asFlow()
.onEach {
println("Item ${it.status}")
}
.take(3)
.toList()
println(list.joinToString { "${it.status} " })
该liveData的实现使其首先发出LOADING,然后继续发出SUCCESS,所以我希望在列表中看到:
LOADING, SUCCESS, SUCCESS
但是由于某种原因,它只返回
Item LOADING
Item SUCCESS
Item SUCCESS
SUCCESS , SUCCESS , SUCCESS
奇怪的是,它在onEach中打印正确的值,如果我将“ take(3)”替换为“ first()”,我确实会获得正确的LOADING状态。
有人遇到过这种行为吗?对我来说,它似乎不适合,因此,如果不是已知情况,我将打开一个错误报告。
所以事实证明是因为我的LiveData不断修改一个对象并发送它,而不是每次都创建一个新实例。
我有一个类似的LiveData:
class EmittingLiveData : LiveData<StateData<Int>>() {
init {
value = StateData()
}
override fun observe(owner: LifecycleOwner, observer: Observer<in StateData<Int>>) {
startEmitting()
super.observe(owner, observer)
}
override fun observeForever(observer: Observer<in StateData<Int>>) {
startEmitting()
super.observeForever(observer)
}
private fun startEmitting() {
GlobalScope.launch(Dispatchers.Unconfined) {
value = value?.loading()
async {
while (this.isActive) {
delay(1000)
postValue(value?.success(0))
}
}.start()
}
}
}
并且不得不将过帐值更改为
postValue(StateData<Int>().success(0))
一个菜鸟-对象参考-问题,但我没想到流程会如此。所以也许其他人也会发现它有帮助:)
帮助我的信贷转到qwwdfsad github issue