Android Kotlin take(int).toList()省略第一个元素
我有一个测试LiveData,它每2秒发出一个项目。 我将其转换为flow,并对其调用take(3).toList() liveData的实现使其首先发出加载,然后继续发出成功,因此我希望在列表中看到:Android Kotlin take(int).toList()省略第一个元素,android,kotlin,android-livedata,Android,Kotlin,Android Livedata,我有一个测试LiveData,它每2秒发出一个项目。 我将其转换为flow,并对其调用take(3).toList() liveData的实现使其首先发出加载,然后继续发出成功,因此我希望在列表中看到: LOADING, SUCCESS, SUCCESS 但出于某种原因,它只是回来了 Item LOADING Item SUCCESS Item SUCCESS SUCCESS , SUCCESS , SUCCESS 奇怪的是,它在onEach中打印正确的值,如果我将“take(3)”替换为
LOADING, SUCCESS, SUCCESS
但出于某种原因,它只是回来了
Item LOADING
Item SUCCESS
Item SUCCESS
SUCCESS , SUCCESS , SUCCESS
奇怪的是,它在onEach中打印正确的值,如果我将“take(3)”替换为“first()”,我确实获得了正确的加载状态
有人经历过这种行为吗?在我看来,它不是一个合适的对象,因此,如果它不是已知的情况,我将打开一个错误报告。因此,事实证明它发生了,因为我的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()
}
}
}
class-EmittingLiveData:LiveData(){
初始化{
value=StateData()
}
覆盖乐趣观察(所有者:生命周期所有者,观察者:观察者){
开始匹配()
超级观察者(所有者、观察者)
}
覆盖有趣的ObserveForver(观察者:观察者){
开始匹配()
超级观察员(观察员)
}
私人娱乐开始配对(){
环球镜发射(调度员,无限制){
值=值?.loading()
异步的{
而(this.isActive){
延迟(1000)
postValue(值?.success(0))
}
}.start()
}
}
}
必须将入账价值更改为
postValue(StateData<Int>().success(0))
postValue(StateData().success(0))
一个新手对象引用问题,但我没想到会从flow中得到。因此,也许其他人也会觉得这很有帮助:)
帮助我的积分转到qwwdfsad
postValue(StateData<Int>().success(0))