gpt4 book ai didi

android - 如何正确组合两个实时数据对象

转载 作者:行者123 更新时间:2023-12-02 12:15:49 24 4
gpt4 key购买 nike

我有两个相同类型的 LiveData 对象,我想对输出进行相同的计算。像 Rx 中的合并运算符之类的东西我怎样才能实现这一点。目前我正在这样做:

class VM : ViewModel() {
val input1LiveData = MutableLiveData<Int>()
val input2LiveData = MutableLiveData<Int>()
val squareLiveData = MutableLiveData<Int>()
}

class MyFragment : Fragment() {
private void fillSquare(input: Int){
viewmodel.squareLiveData.value = input * input
}
override onViewCreated(){
viewmodel.input1LiveData.observe(viewLifecycleOwner){
fillSquare(it * it)
}
viewmodel.input2LiveData.observe(viewLifecycleOwner){
fillSquare(it * it)
}
}
}

我认为这是一个不好的方法

最佳答案

您可以使用 MediatorLiveData,它是一种特殊类型的 LiveData,能够作为源连接到其他 liveData 对象。您可以像这样改进上面的代码:

class VM : ViewModel() {
val input1LiveData = MutableLiveData<Int>()
val input2LiveData = MutableLiveData<Int>()

val squareLiveData = MediatorLiveData<Int>().apply{
val observer = Observer<T> { value = it*it }
addSource(input1LiveData, observer)
addSource(input2LiveData, observer)
}
}

class MyFragment : Fragment() {
override onViewCreated(){
viewmodel.squareLiveData.observe(viewLifecycleOwner){
//do your ui updates
}
}
}

上面的代码将创建一个具有 2 个源的 MediatorLiveData 对象,观察者将计算平方并设置值。


您也可以使用ReactiveLiveData库,使用响应式(Reactive)方法来实现这一点,使代码更易于编写和阅读:D 就像这样。

class VM : ViewModel() {
val input1LiveData = MutableLiveData<Int>()
val input2LiveData = MutableLiveData<Int>()

val squareLiveData = input1LiveData.merge(input2LiveData).map{it*it}
}

class MyFragment : Fragment() {
override onViewCreated(){
viewmodel.squareLiveData.observe(viewLifecycleOwner){
//do your ui updates
}
}
}

关于android - 如何正确组合两个实时数据对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64566307/

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