gpt4 book ai didi

android - Kotlin - 在运行函数之前等待多个 LiveData 被观察

转载 作者:行者123 更新时间:2023-12-04 23:40:39 28 4
gpt4 key购买 nike

我正在使用 viewModel 从房间数据库中提取实时数据。我从我的 viewModel 中提取了 2 个 LiveData,然后我将运行一个函数从我的服务器中提取数据。在运行将从我的服务器获取信息的函数之前,我需要设置这两个值,因为这些值是帖子正文的一部分。
这是我 Activity 的一部分

var locationSeleted:Long=0L

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView<ActivityBinding>(this,R.layout.activity)

//This is to get the viewmodel
val application = requireNotNull(this).application
val dataSource = Database.getInstance(application).DatabaseDao
val viewModelFactory = ViewModelFactory(dataSource, application)
val ViewModel = ViewModelProviders.of(this,viewModelFactory).get(ViewModel::class.java)

binding.ViewModel = ViewModel
binding.setLifecycleOwner (this)

//Get location from livedata
ViewModel.Location.observe(this, Observer {location ->

if (location == null){
//do something
}
else{
locationSeleted = location.locationId
}

})

//listens to the live data of the products value
ViewModel.Products.observe(this, Observer{products ->

if (products == null){
//do something
}
else{
myfunction(products)
}

})
这是我的 View 模型的一部分
class ViewModel(val database: DatabaseDao, application: Application) : AndroidViewModel(application) {


//This gets the location selected
var Location: LiveData<LocationSelect> = database.get_location()

//This line gets the products
var Products: LiveData<Array<Products>> = database.get_products()


我当前的代码有效,但我可以想象,如果 Location LiveData 延迟,那么 myfunction 将在没有位置的情况下运行,并且 Post 调用将为 false。我的问题是当从 viewModel 设置位置和产品时如何调用 myfunction?或者有没有更好的方法来做到这一点。
谢谢

最佳答案

您可以使用 MediatorLiveData,因此您只需要观察一件事,并且仅在收到这两个项目时以及之后的每次更改时才会触发。
在 View 模型中:

val locationAndProductsLiveData: LiveData<Pair<LocationSelect, Array<Products>>> = 
object: MediatorLiveData<Pair<LocationSelect, Array<Products>>>() {
var location: LocationSelect? = null
var products: Array<Products>? = null
init {
addSource(Location) { location ->
this.location = location
products?.let { value = location to it }
}
addSource(Products) { products ->
this.products = products
location?.let { value = it to products }
}
}
}
在您的 Activity 中:
ViewModel.locationAndProductsLiveData.observe(this) { (location, products) ->
locationSelected = location.Id
myFunction(products)
}

关于android - Kotlin - 在运行函数之前等待多个 LiveData 被观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63528738/

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