Тема Dispatchers.IO сопрограммы - PullRequest
0 голосов
/ 11 января 2019

Я изучаю сопрограммы в Android. У меня есть следующий код:

private val scope = CoroutineScope(Dispatchers.Main + job)

operator fun invoke(token: String, callback: TaskCallback) {
    scope.launch {
        withContext(Dispatchers.IO) { userDataSource.saveApiToken(token) }
        callback.onCompleted()
    }
}

Я ожидал, что userDataSource.saveApiToken(token) будет вызываться из отдельного потока, но он запускается в основном потоке (Looper.myLooper () == Looper.getMainLooper () возвращает true внутри метода). В чем может быть причина? [моя ошибка]

Я использую плагин Kotlin версии: 1.3.11-release-Studio3.2-1 и следующие зависимости: kotlinx-coroutines-core: 1.0.1 и kotlinx-coroutines-android: 1.0.1

1 Ответ

0 голосов
/ 11 января 2019

Поток в блоке withContext(Dispatchers.IO) должен быть фоновой нитью . Если мы разместим там логи:

operator fun invoke(token: String, callback: TaskCallback) {
    scope.launch {
        withContext(Dispatchers.IO) { Log.e("Log", "t: ${Thread.currentThread()}") }
        callback.onCompleted()
    }
}

мы увидим Тема [DefaultDispatcher-worker-1,5, main] . Таким образом, поток является фоновым потоком . Как отметил @Marko Topolnik в комментариях, основная цель сопрограмм - избавиться от обратных вызовов. Пожалуйста, попробуйте изменить код и удалить callback: TaskCallback.

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