Я просто читаю и изучаю сопрограммы в Котлине, чтобы использовать их в небольшой библиотеке для развлечения/обучения. В документации вы можете сделать что-то вроде
GlobalScope.launch {
}
Итак, в моем методе
fun myMethod() {
GlobalScope.launch {
// do some networking code
}
}
Лучше всего использовать GlobalScope для запуска сопрограммы для библиотеки? В документах написано
Application code usually should use application-defined CoroutineScope, using async or launch on the instance of GlobalScope is highly discouraged.
Очевидно, это библиотека, а не обязательно код приложения. Но я не был уверен, что это лучший способ сделать сеть в фоновом режиме с помощью сопрограмм.
я тоже пробовал
runBlocking {
async {
// do some networking code
}
}
Думая, что runBlocking вводит новую область сопрограммы, но я думаю, что в этом случае она наследует область от своих родителей, которая является основным потоком, поэтому я получаю исключение об отсутствии сети в основном потоке пользовательского интерфейса.
@EpicPandaForce. Спасибо. Мне было интересно, было ли это также «лучшей практикой», когда функции приостанавливали функции для клиента, чтобы использовать их по мере необходимости.





Вы можете создать функцию приостановки, и это обеспечит, чтобы пользователь сам вызывал ее из сопрограммы.
Если ваш метод использует withContext, вам не нужно беспокоиться о GlobalScope или настройке области действия. withContext просто сообщает сопрограмме, какой контекст использовать (для работы в сети вам понадобится IO. И область теперь определяется тем, как пользователь запускает ее.
Я бы построил ваш метод следующим образом:
suspend fun myMethod() = withContext(Dispatchers.IO) {
// do some networking code
}
В зависимости от того, чего вы пытаетесь достичь, вы можете использовать разные шаблоны даже внутри библиотеки.
Если ваша функция должна быть немедленно вернуться после запуска некоторых сопрограмм, «лучшей практикой» будет объявить вашу функцию как расширение CoroutineScope, чтобы вам не нужно было использовать глобальную область видимости:
fun CoroutineScope.launchesAndReturnsImmediately() {
// launch can be called because we are extending CoroutineScope
launch {
// some work
}
}
При этом вы часто не нужно возвращаться немедленно в библиотеке, поэтому вместо этого вы можете объявить свои функции suspend, что легче понять на стороне потребителя. Там несколько вариантов:
withContext для запуска в соответствующем пуле потоков, или вызвать другие функции приостановкиcoroutineScope для запуска дочерних сопрограмм и декомпозиции работы, но приостановите работу, пока все дочерние сопрограммы не будут выполненыsuspendCoroutine или suspendCancellableCoroutine
Я бы подумал, что библиотека должна предоставлять функции приостановки и позволять пользователю обрабатывать контекст выполнения потоков, но кто знает наверняка.