Android:实时数据跳过值

问题描述 投票:0回答:1

我正在使用实时数据将状态从视图模型发布到片段,这可能导致状态被频繁发布。但是Mutable Live Data正在跳过初始值,而采用最新的可用值。

[article讨论了此特性,但是有一种方法可以处理这种情况,例如Flowable in RxJava或设置Back Pressure Strategy,否则我将需要返回使用RxJava并处理基于生命周期的方法发布?

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

片段(订户):

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
android android-livedata backpressure
1个回答
0
投票

使用RxJavaLiveData旨在通过主线程在视图层中观察。对于LiveData观察者而言,消耗的屏幕刷新率或人眼无法承受的费用是没有意义的。

在单个项目中同时使用RxJavaLiveData是合理的设计选择。互联网上应该有几篇文章和代码示例,这是我刚发现的文章和代码示例:https://proandroiddev.com/mvvm-architecture-using-livedata-rxjava-and-new-dagger-android-injection-639837b1eb6c

© www.soinside.com 2019 - 2024. All rights reserved.