android - 协程是否在 if 条件下维持秩序?

标签 android kotlin kotlin-coroutines coroutine

我在编写 if 语句时想做这样的事情,我的目标是首先检查将 bool 标志设置为 true 或 false 以返回的协程,然后检查内部的 bool 标志如果条件和函数将产生预期值,则相同。

我的问题是 bool 值的 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 函数绝不能阻塞。请参阅 this article 中的暂停公约部分由 Kotlin 协同程序的设计负责人。

但是,无论该函数是挂起函数还是阻塞,代码都将同步执行,就好像这不是在协程中一样。在您的示例中,将执行 if 条件中的 myBlockingCoroutineFunction(),并在返回后计算 bool 表达式的下一部分。

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

关于android - 协程是否在 if 条件下维持秩序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73451328/

相关文章:

intellij-idea - IDEA 在树中两次显示一个项目

Java String 类 replaceAll 方法丢失

android - 如何使用 Kotlin Coroutines 正确地拥有待处理操作队列?

android - href ="tel:"和免费电话号码 (0800) 可变设备行为

Android CollapsingToolbarLayout 标题 - 上边距错误

java - 在 TypedArray#getTextArray() 期间抛出异常

asynchronous - async 是 Kotlin 中 Coroutines 的关键字吗?

Android:当acitvity支持横向和纵向时如何设置默认方向

kotlin - 如何使用 kotlin 协程创建轮询机制?

android - 为什么 fragment 中的生命周期范围.launch 会阻塞 UI 线程?