Android应用开发中的新功能。我正在使用kotlin,正在尝试从我的viewmodel的房间数据库中检索一个列表,并在按下按钮时对我的片段进行敬酒(下面的代码)。如果按一次按钮,将得到一个空字符串,但是如果按两次,将得到列表。我该怎么做才能一键检索列表?可能我缺少协程中的某些东西。
视图模型代码:
var Listado = ""
fun listaTotal(): String {
uiScope.launch {
getTodaListaCompra().forEach{
Log.i("Listado Compra",Listado )
Listado = Listado + " " + it
Log.i("Data",data.value)
Log.i("Pueba",it)
}
}
return Listado
}
片段通话:
Toast.makeText(application, tabListaCompraViewModel.listaTotal(), Toast.LENGTH_SHORT)
.show()
提前致谢
您在开始时定义了一个空字符串。首次调用listaTotal()时,协程程序在后台启动以计算'listado'的值。但是,listaTotal的返回不等待后台协程完成。这就是为什么“ listado”仍然为空。
在第一次和第二次单击按钮之间,第一个协程完成,并且“ listado”现在不再为空,因此,当您第二次单击按钮时,协程再次启动,但是“ listado”又在该协程之前返回完成,因此返回第一次单击按钮的结果。
因为您只能在主UI线程上进行Toast,所以需要告诉它等待协程完成以获取返回的值。您可以使用runBlocking来做到这一点,如下所示:
fun listaTotal(): String = runBlocking {
getTodaListaCompra().forEach{
Log.i("Listado Compra",listado )
listado += " " + it
Log.i("Data",data.value)
Log.i("Pueba",it)
}
listado
}
更新:为明确起见,此方法会阻塞主UI线程,直到返回结果。因此,您应该考虑使用LiveData(请参阅Sergeys答案)或Flows来获取数据。这个答案的目的主要是解释代码和协程的行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句