Go вернуться к основному потоку внутри сопрограммы? - PullRequest
0 голосов
/ 21 марта 2020

Я запускаю этот код, так как 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 {..}) вместо процедуры, но я читал, что не должен делать намерений внутри какого-либо другого потока, кроме основного потока, поэтому я перешел на сопрограмму.

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Клиент Firebase уже выполняет любые операции сетевого и дискового ввода-вывода в отдельном потоке. Почти никогда не нужно запускать addListenerForSingleEvent в отдельном потоке самостоятельно.

Также смотрите:

0 голосов
/ 21 марта 2020

Функция анонимного объекта может захватывать переменные области видимости, но она не заключена в тело сопрограммы. Замените withContext(Main) созданием новой сопрограммы: <CoroutineScope>.launch(Main).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...