代码之家  ›  专栏  ›  技术社区  ›  Antonio Caravaggio

科罗廷中未更新的变量

  •  1
  • Antonio Caravaggio  · 技术社区  · 1 年前

    我制作了一个协程来更新变量的值,但它不起作用:

    fun findNameById(id: Long): String {
        var name = ""
        viewModelScope.launch(Dispatchers.IO) {
            val result = async { repository.findName(id) }.await()
            name = result
        }
        return name
    }
    

    变量 name 从来没有更新过,它总是一个空字符串,我不明白为什么。函数 findName 工作正常,我检查过了,但变量 名称 从不更新。为什么?

    1 回复  |  直到 1 年前
        1
  •  2
  •   tyg    1 年前

    当启动一个新的协程时,剩余的代码会立即继续,并且新的协程会异步执行。

    这里发生的情况如下:

    1. name 设置为 "" .
    2. 一个新的协程被启动,并且局部变量 名称 为的lambda捕获 launch .
    3. 名称 返回(即 "" )
    4. 新的协程从主线程移动到IO调度器的一个单独线程,然后执行它的块。
    5. 即使在 findNameById 已完成变量 名称 仍然存在(因为它被2捕获)。此变量现在设置为的值 result .
    6. 郊游结束 名称 被释放并从内存中删除,因为它不再被使用,新值消失,甚至一次也不读取。

    您可以使用 async 而不是 发射 如果你需要合作的结果。您也可以更新其他一些变量(如类属性),这些变量甚至在 findNameById 饰面。