在 Kotlin 代码中,runBlocking 不会阻塞

问题描述 投票:0回答:1

我正在尝试运行一个名为 getGroupSummaries 的函数,并在下一个代码运行之前完成它。 getGroupSummaries 的声明如下:

          suspend fun getGroupSummaries(groupInfo: GroupInformation, adminUserInfo: 
                 UserInformation){

它的调用方式如下:

          runBlocking {
                val getGroupSummariesJob = viewModelScope.launch {
                    getGroupSummaries(groupInformation, userInformation)
                }

                    getGroupSummariesJob.join()
                }

            Timber.e("After getGroupSummaries, groupInformationList size = " + groupInformationList.size)
           

此日志消息表明 groupInformationList 的大小为 0。 在 getGroupSummaries 内部,我有一条日志消息,打印出 groupInformationList 的大小,大小为 1。

第一个日志消息应该在 getGroupSummaries 结束后显示,但在第二个日志消息(位于 getGroupSummaries 内部)之前显示。这说明阻塞没有正常工作。我对这种语法很陌生,希望得到任何建议。

在制作一个最小的可重现示例时,我删除了一个循环,然后该示例正常工作。感谢您提出这样做的建议。

kotlin blocking
1个回答
0
投票

如果您使用其他范围启动(如

viewModelScope
),runBlocking 不会等待它。您需要使用 runBlocking 自己的范围来启动,该范围作为其 lambda 的接收器提供,因此只需使用裸的
launch
。除非,如果您只想等待简单的挂起函数调用(无并行性),则不应启动任何内容。直接调用里面的挂起函数就行了
runBlocking

确保您没有在主线程上使用

runBlocking
!除了将协程代码与遗留的非协程多线程代码链接之外,将其用于任何其他用途都是一种代码味道。

© www.soinside.com 2019 - 2024. All rights reserved.