runBlocking{
        val x  = MutableStateFlow<Int?>(null)
        CoroutineScope(Dispatchers.Default).launch{
            println("这个范围的开始")
            x.emit(3)
            println("这个范围的结束")
        }
        println("父作用域")
        println(x.first())
   }

发帖主题:Re:Kolibrios

  • 父作用域
  • 这个范围的开始
  • 这个范围的结束
  • 3
runBlocking{
val x  = MutableStateFlow<Int?>(null)
launch{
println("这个范围的开始")
x.emit(3)
println("这个范围的结束")
}
println("父作用域")
println(x.first())
}

发帖主题:Re:Kolibrios

  • 父作用域
  • null
  • 这个范围的开始
  • 这个范围的结束

只有协同程序生成器和作用域有区别,但我得到了意外的输出? 有人能告诉我为什么会这样吗?

推荐答案

runBlocking测试协程的异步行为可能会让您感到困惑,因为它使用的是一个单线程调度器,最终由零参数launch继承.

第一个样本的结果是随机的(只需运行几次,有时返回null而不是3).成功取决于这样一个事实:println在某种程度上是一个繁重的操作,这给了新的协程足够的时间来启动和释放值.

同时第二个是practically确定性的(没有多线程竞争).它运行你的块,直到它到达一个挂起点—但没有挂起点,所以它一直运行直到你的runBlocking的根被完成,直到这时分派器才开始执行launch—ed的子协程.

如果你希望你的结果更可靠,也许你想实际挂起,直到它可用,使用x.filterNotNull().first().

Android相关问答推荐

三星上的某些应用程序已禁用通知权限切换

当我的Log.i()不在主线程中时,如何在我的logcat中显示它?

在Android应用程序上使用Room数据库时,是否可以预先填充数据

如何在Jetpack Compose中使用Box Composable来实现这种布局?

Android和Rust,OpenSSL交叉编译在ARM V7上链接失败

Play Google上发布的一款应用的房间数据库迁移

插入视图模型时,dagger 未命中绑定错误

如何判断堆肥是否为空?

Android 14预测性背部手势-闪烁的白色背景色

从包含的(复合)模块导入 Kotlin 类时,Android 应用程序模块的 build.gradle.kts 未解决的引用错误

从我的 Android 应用程序发送到 Gin 时失败,但从 Postman 发送到 Gin 时成功

如何在Android Studio中禁用文件中的Github用户名引用?

Jetpack Compose 中的用户在线指示器

SQLite Kotlin 问题 - 没有数据库

将 CircularProgressIndicator 添加到按钮而不增加其高度

如何在 Jetpack Compose 中为中心对齐设置动画?

无法为:app@debug/compileClasspath解析依赖项com.github.dhaval2404:imagepicker-support:1.7.1

Horizo​​ntalPager 的可组合物中的 LaunchedEffect 问题

Android build gradle 文件版本代码自动递增

优化 Room 数据库迁移