Kotlin协程列表返回空值

恩里卡纳姆玛·加西亚·卡德纳斯

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从内部嵌套的协程返回标签Kotlin

来自分类Dev

如何从协程范围返回值

来自分类Dev

NetworkBoundResource与Kotlin协程

来自分类Dev

暂停Kotlin协程,直到流具有特定值

来自分类Dev

是否有从协程端点返回值的标准方法

来自分类Dev

如何等待并正确从异步协程返回值

来自分类Dev

使用协程使函数返回在回调中获得的值

来自分类Dev

是否有从协程端点返回值的标准方法

来自分类Dev

要求提供示例代码以了解协程中throw()的返回值,该协程返回值

来自分类Dev

在Kotlin中测试协程

来自分类Dev

Kotlin 协程范围定义

来自分类Dev

Kotlin 协程,持续更新

来自分类Dev

Kotlin协程壁垒:等待所有协程完成

来自分类Dev

剥离列表将返回空白值

来自分类常见问题

Kotlin协程如何比RxKotlin更好?

来自分类Dev

关于Kotlin协程取消的问题

来自分类Dev

Kotlin协程主管取消作业的行为

来自分类Dev

未解决的参考:等待。Kotlin协程

来自分类Dev

Kotlin协程-延迟,如何运作?

来自分类Dev

Kotlin协程的正确使用方法

来自分类Dev

使用协程的Kotlin / Native多线程

来自分类Dev

Kotlin协程比线程花费的时间更长

来自分类Dev

具有Kotlin协程的FusedLocationProviderClient

来自分类Dev

Kotlin协程执行的优先级

来自分类Dev

Unity-仅在协程完成后才需要返回值

来自分类Dev

如何由于超时而从已取消的python asyncio协程返回值

来自分类Dev

如何返回依赖于方法中启动的协程结果的值?(C#)

来自分类Dev

如何从异步协程作用域(例如ViewModelScope)返回值到UI?

来自分类Dev

关于asyncio模块,如何获取子协程的返回值?