最近在学习如何使用Kotlin协程时,已阅读了几篇相关文章。但是其中之一使我感到困惑:Coroutines On Android (part III): Real work
如前所述:
注意:Room使用自己的调度程序在后台运行查询 线。您的代码不应使用withContext(Dispatchers.IO)进行调用 暂停房间查询。它将使代码复杂化,并使您的 查询运行速度慢。
当我看到这些段落时似乎很有意义,但是当我打开一个Android项目并尝试深入研究时,问题出现了,Android Studio警告我:
挂起函数“ yourMethod”应仅从协程调用 或其他暂停功能
我现在在这里冻结,因为文章告诉我不要使用withContext(Dispatchers.IO)
。我现在想知道应该使用withContext(Dispatchers.Main)
还是使用GlobalScope.launch
来运行查询?
答案 0 :(得分:0)
我对协程也是陌生的,到目前为止,这是我所了解的。如果我想与数据库进行交互,
lifecycleScope.launch {
//this is still the main thread
//interact with database
NoteDatabase(this).getNoteDao().addNote(Note(id=0, title = "TITLE", note = "BODY"))
//signature of addNote: @Insert suspend fun addNote(note: Note)
}
使用lifecycleScope可确保您在活动或片段被销毁后不执行任何操作,但是使用GlobalScope可能更有意义,因为您不希望在退出要编辑的活动时取消添加/保存操作数据库条目。
使用“挂起”时,不能保证该功能是非阻塞的。如果存在阻塞代码,则更改协程上下文是程序员的责任。我确认Room确实通过检查构建来更改上下文,因此您不必担心自己更改上下文: