gpt4 book ai didi

安卓 : Live Data skipping values

转载 作者:行者123 更新时间:2023-12-04 00:24:01 25 4
gpt4 key购买 nike

我正在使用实时数据将状态从 View 模型发布到 fragment ,这可能会导致状态被频繁发布。但是可变实时数据正在跳过初始值并采用最新的可用值。

有一个article其中谈到了这个特性,但是有没有办法处理这种情况,例如Flowable in RxJava或设置 Back Pressure Strategy还是我需要重新使用 RxJava 并处理基于生命周期的发布?

以下是显示此行为的示例代码。发布了从 1 到 10 的值,但只收到了两个值,0 和 10。我们可以在 Live Data 中更改此行为,还是应该为此目的使用 RxJava?

fragment (订阅者):

class ParentFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

viewModel = ViewModelProviders.of(
this, ParentViewModelFactory(this, null)
).get(ParentViewModel::class.java)

viewModel.fastLiveData.observe(this, Observer {
Timber.i(it.toString())
})

viewModel.startPublishing()
}
}

查看模型(发布者):
class ParentViewModel(private val savedState : SavedStateHandle)
: ViewModel<ParentState>() {

val fastLiveData : MutableLiveData<Int> = MutableLiveData(0)

fun startPublishing() {
for(x in 1..10) {
Timber.i(x.toString())
fastLiveData.postValue(x)
}
}
}

输出:
(ParentViewModel.kt:30)#startPublishing: 1
(ParentViewModel.kt:30)#startPublishing: 2
(ParentViewModel.kt:30)#startPublishing: 3
(ParentViewModel.kt:30)#startPublishing: 4
(ParentViewModel.kt:30)#startPublishing: 5
(ParentViewModel.kt:30)#startPublishing: 6
(ParentViewModel.kt:30)#startPublishing: 7
(ParentViewModel.kt:30)#startPublishing: 8
(ParentViewModel.kt:30)#startPublishing: 9
(ParentViewModel.kt:30)#startPublishing: 10
(ParentFragment.kt:57)#onChanged: 0
(ParentFragment.kt:57)#onChanged: 10

最佳答案

原因是您使用的是 postValue()

  • postValue将在后台线程上设置值,如果发射很多,它将设置最新值。
  • setValue将在主线程
  • 上设置您的值

    如果您将更改为 fastLiveData.setValue(x)你会得到你想要的行为。

    关于安卓 : Live Data skipping values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58379940/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com