【发布时间】:2020-09-13 05:34:21
【问题描述】:
最近在学习如何使用 Kotlin Coroutines 时,阅读了几篇相关文章。但是其中一个让我感到困惑:Coroutines On Android (part III): Real work
正如它所指出的:
注意:Room 使用自己的调度程序在后台运行查询 线。您的代码不应使用 withContext(Dispatchers.IO) 来调用 暂停房间查询。它会使代码复杂化并使您的 查询运行速度较慢。
当时我看到这一段似乎很有道理,但是当我打开一个 Android 项目并尝试深入研究时,问题出现了,Android Studio 警告我:
暂停函数“yourMethod”只能从协程中调用 或其他挂起功能
我现在在这里冻结,因为文章告诉我不要使用withContext(Dispatchers.IO)。我现在想知道我应该使用withContext(Dispatchers.Main) 还是使用GlobalScope.launch 来运行我的查询?
【问题讨论】:
-
“我现在想知道我应该使用 withContext(Dispatchers.Main) 还是使用 GlobalScope.launch 来运行我的查询?” -- 使用
launch()(或者async()和await())和一个合适的CoroutineScope。那可能是GlobalScope,但通常有更好的选择(viewModelScope在ViewModel上,lifecycleScope在活动上,viewLifecycleScope在片段上,自定义CoroutineScope如看到的here 等。 -
@CommonsWare 谢谢,我正在寻找一个不应该被取消的工作的解决方案,你提供的链接正是我正在寻找的,我会检查一下。感谢您的帮助!
-
如果您不想取消暂停有趣的操作,请尝试 withContext(NonCancellable) {}
-
@sasikumar 您的解决方案似乎对这个问题没有帮助。项目中的“suspend”关键字被 Android Studio 标记为“冗余”。
标签: android kotlin android-room kotlin-coroutines