Буду ли я всегда добавлять withContext (Dispatchers.IO) в ждущий режим, когда получаю данные с удаленного сервера? - PullRequest
2 голосов
/ 29 марта 2020

Я изучаю сопрограммы Kotlin.

Следующее содержание взято из художественного https://developer.android.com/kotlin/coroutines.

Важно: Использование suspend не говорит Kotlin о запуске функции в фоновом потоке. Для функций приостановки нормально работать в основном потоке. Также распространено запускать сопрограммы в главном потоке. Вы всегда должны использовать withContext () внутри функции приостановки, когда вам нужна основная безопасность, например, при чтении с диска или записи на диск, выполнении сетевых операций или выполнении операций с интенсивным использованием ЦП.

Обычно я трачу много времени на извлечение данных с удаленного сервера, поэтому мне нужно поместить «функцию извлечения данных» в фоновом потоке, чтобы не заморозить основной интерфейс.

Должен ли я всегда добавлять withContext (Dispatchers) .IO) в состоянии приостановки, когда я использую функцию приостановки для извлечения данных с удаленного сервера?

Кстати,

Код A взят из проекта https://github.com/googlecodelabs/kotlin-coroutines, вы можете увидеть это .

Но я не могу найти ключевое слово withContext () в проекте, почему?

Код A

fun refreshTitle() = launchDataLoad {
    repository.refreshTitle()
}


private fun launchDataLoad(block: suspend () -> Unit): Unit {
    viewModelScope.launch {
        try {
            _spinner.value = true
            block()
        } catch (error: TitleRefreshError) {
            _snackBar.value = error.message
        } finally {
            _spinner.value = false
        }
    }
}

1 Ответ

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

Должен ли я всегда добавлять withContext (Dispatchers.IO) в suspend, когда я использую suspend для извлечения данных с удаленного сервера?

Это зависит. Если вы используете библиотеку наподобие Retrofit 2.6.0, которая имеет встроенную поддержку suspend, диспетчер уже Dispatchers.IO (или какой-либо другой вариант, который библиотека сочтет более подходящим).

Если вызывается извлечение данных из удаленный сервер блокируется, вам нужно убедиться, что он запущен на Dispatcher.IO самостоятельно с withContext(Dispatchers.IO), чтобы не блокировать основной поток.

Я не могу найти ключевое слово withContext () в проект, почему?

Поскольку в проекте используется Retrofit, переключение на Dispatchers.IO происходит под капотом: https://github.com/googlecodelabs/kotlin-coroutines/blob/master/coroutines-codelab/finished_code/src/main/java/com/example/android/kotlincoroutines/main/MainNetwork.kt

...