Android livedata builder是否可以进行一次性操作?
例如,假设我们有一个产品目录视图,可以选择将产品添加到购物车。 每次用户单击“添加到购物车”时,都会调用viewModel方法addToCart,如下所示:Android livedata builder是否可以进行一次性操作?,android,kotlin,mvvm,android-livedata,Android,Kotlin,Mvvm,Android Livedata,例如,假设我们有一个产品目录视图,可以选择将产品添加到购物车。 每次用户单击“添加到购物车”时,都会调用viewModel方法addToCart,如下所示: //inside viewModel fun addToCart(item:Item): LiveData<Result> = liveData { val result = repository.addToCart(item) // loadUser is a suspend function. emit(re
//inside viewModel
fun addToCart(item:Item): LiveData<Result> = liveData {
val result = repository.addToCart(item) // loadUser is a suspend function.
emit(result)
}
//inside view
addButton.onClickListener = {
viewModel.addToCart(selectedItem).observe (viewLifecycleOwner, Observer () {
result -> //show result
}
}
//内部视图模型
fun addToCart(item:item):LiveData=LiveData{
val result=repository.addToCart(item)//loadUser是一个挂起函数。
发射(结果)
}
//内部视图
addButton.onClickListener={
viewModel.addToCart(selectedItem).observe(viewLifecycleOwner,Observer(){
结果->//显示结果
}
}
添加5项->视图在内存中观察到5个livedata对象后会发生什么
如果是,什么时候清理?如果是,我们是否应该避免使用livedata builder进行可以多次调用的一次性操作?您的实现似乎是错误的!对于每个
addToCard
函数调用,您都会不断返回一个新的livedata
对象。关于您的第一个问题,这是yes
如果您希望通过liveData正确地执行此操作
//在ViewModel中
private val_result=MutableLiveData()
val结果:LiveData
获取()=\u结果;
乐趣添加艺术(项目:项目){
viewModelScope.launch{
//调用挂起函数
result.value=。。。
}
}
//活动/片段
viewModel.result.observe(lifecycleOwner){result->
//处理结果
...
}
viewModel.addToCart(selectedItem)
您所要做的就是从activity调用它并处理结果。您也可以使用它。它还有一个扩展名
asLiveData
,该扩展名还可以转换Flow->LiveData。根据LiveData
实现:
public-void-observe(@NonNull-LifecycleOwner-owner,@NonNull-observe对于一次性操作,您的方法没有问题。
我认为使用liveData
builder不会有任何内存泄漏。
例如,如果您为LiveData
使用私有备份属性,并观察公共LiveData
,则可能会发生不同的行为,如在为其指定新值之前获取最新值
TL;DR
如果您的操作是一次性的,请使用Coroutine
和LiveData
如果您的操作服务于流,您可以使用流
您的答案指向“正确”的方式,但您没有回答“不断返回新的LiveData”时为什么错误以及会发生什么情况的问题。根据OP的代码,当单击按钮时,它将只调用观察者一次,后续的调用将创建它的新实例并只调用观察者一次。最终,以前的LiveData
对象将自动被垃圾收集。@kaustubhpatange谢谢,你的答案正是我在e矩->但是,我问这个问题是因为我在多个地方发现有人建议可以甚至应该用一个新的livedata builder块替换MutableLiveData,这是我对它的担忧——看起来对于可重复的一次性操作是不安全的。“可重复的一次性操作”=paradox!如果您想要一个一次性的LiveData,这通常是导航事件的情况,那么每次订阅者想要订阅时实例化LiveData是一个非常简单的方法。这显然只适用于预期只有一个订阅者的情况。否则,即重用一个实例,会导致单个订阅者的问题LiveEvent打算解决。为什么要制造额外的问题?谢谢,这就是我目前的做法…我试图评估是否应该切换到livedata{}builder,但您刚刚确认了我对多个实例的担忧。