我正在运行此代码,因为 addListenerForSingleEvent
是一个长时间运行的操作:
CoroutineScope(IO).launch {
userRef.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
if (p0.exists()) {
withContext(Main) {
toggleLoading()
val intent = Intent(this@LogInActivity, MainActivity::class.java)
startActivity(intent)
finish()
}
} else{
withContext(Main) {
var addUsernameIntent = Intent(this@LogInActivity,
AddUsernameActivity::class.java)
startActivityForResult(addUsernameIntent, CHOOSE_USERNAME_REQUEST)
}
}
}
})
}
我在编写 withContext(Main)
时遇到错误:
Suspension functions can be called only within coroutine body
但是我有一个协程体,对吗?在我只有一个 Thread(runnable {..})
而不是协程之前,但我读到我不应该在除主线程之外的任何其他线程中执行意图,所以我改为协程。
最佳答案
Firebase 客户端已经在单独的线程上运行任何网络和磁盘 I/O 操作。几乎不需要自己在单独的线程上运行 addListenerForSingleEvent
。
另见:
关于firebase - 回到协程内的主线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60786749/