由于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)
时出现错误:
只能在协程体内调用悬浮函数
但是我有一个协程的身体,对吗?在我刚开始使用Thread(runnable {..})
而不是Couroutine之前,但我读到我不应该在除主线程之外的任何其他线程中执行意图,所以我改用了协程。
答案 0 :(得分:2)
Firebase客户端已经在单独的线程上运行任何网络和磁盘I / O操作。几乎不需要自己在单独的线程上运行addListenerForSingleEvent
。
另请参阅:
答案 1 :(得分:1)
匿名对象的功能可以捕获作用域的变量,但不包含在协程体内。将withContext(Main)
替换为创建新的协程:<CoroutineScope>.launch(Main)
。