返回协程内部的主线程?

时间:2020-03-21 10:33:20

标签: firebase kotlin firebase-realtime-database firebase-authentication kotlin-coroutines

由于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之前,但我读到我不应该在除主线程之外的任何其他线程中执行意图,所以我改用了协程。

2 个答案:

答案 0 :(得分:2)

Firebase客户端已经在单独的线程上运行任何网络和磁盘I / O操作。几乎不需要自己在单独的线程上运行addListenerForSingleEvent

另请参阅:

答案 1 :(得分:1)

匿名对象的功能可以捕获作用域的变量,但不包含在协程体内。将withContext(Main)替换为创建新的协程:<CoroutineScope>.launch(Main)