在编写if语句时,我想做一些类似的事情,我的目标是首先判断协程,它将把返回的布尔标志设置为真或假,然后判断相同的IF条件和函数中的布尔标志是否也会得到期望值.

我的问题是,布尔值的if语句中的求值是在协程结束之前还是之后.

换句话说,我有这个功能

if(myBlockingCoroutineFunction() && !myCondition) return@launch


private suspend myBlockingCoroutineFunction(): Boolean {
   //some logic here
   //Updates the local myCondition
   myCondition = false
   return true
 }

我的问题是,如果阻塞if语句中的第一个参数,这将与

if(myBlockingCoroutineFunction())  {
  if(!myCondition)
  return@launch
}

据我所知,在内部,if语句将比较参数的两个地址,以查看它们是否与继续执行的谓词匹配,但在这种情况下,我不确定是否会在协程执行时存储myCondition值,然后将其与函数的结果进行比较,但没有注意到myCondition已经更改

推荐答案

首先,挂起函数的名称中有blocking是没有意义的,因为按照惯例,suspend函数永远不能阻塞.参见Kotlin协程的设计领导在this article年中的暂停公约一节.

但是,无论函数是挂起函数还是阻塞函数,代码都将同步执行,就像这不是在协程中一样.在您的示例中,IF条件中的myBlockingCoroutineFunction()将被执行,并且在它返回之后,将计算布尔表达式的下一部分.

在同一协程中,您的myCondition变量或属性有顺序保证,不需要同步.如果同时从多个不同的协程修改它,则根据您的用例,您可能需要使用互斥来保护事件的顺序.

Android相关问答推荐

广播接收者意图从服务内设置,而不被其他服务接收

如何使用视图模型触发可变状态?

滑动以更改合成中的活动

如何在Jetpack导航中不显示目的地?

OverridePendingTransition已弃用,我该怎么办?

在Jetpack Compose中实现焦点突出的最佳方式?

Camera2 将图像从 ImageReader 传递到 MediaRecorder

使用 Gadle kotlin 为多模块 Android 代码库设置 jacoco

如何在jetpack compose中使可组合的屏幕zoom 到不同的手机(屏幕)尺寸?

我的自定义小吃店不适合我的全宽屏幕尺寸

围绕动态大小的内容包装 Jetpack Compose Row?

如何在 Jetpack Compose 中设置卡片高度

Hilt 依赖注入重复绑定错误

房间创建三四表关系

使用 capacitor cordova 插件的 Android Studio 错误

在jetpack compose中将图像添加到脚手架顶部栏

我的 react native 项目的发布签名 apk 没有在设备中打开,而且它创建的尺寸非常小

新安装 Expo Go 的 android 设备上的 sdk 46.0.0 (@snack/sdk.46.0.0) 出错

Android Material Date Range Picker - 如何仅更改所选范围日期的文本 colored颜色 ?

Android Compose webview 被拉伸