#android #kotlin #kotlin-coroutines #android-architecture-components
#Android #kotlin #kotlin-сопрограммы #android-архитектура-компоненты
Вопрос:
Какой подход рекомендуется при вызове нескольких функций приостановки внутри activity или fragment? (Для некоторых функций требуется результат другой операции)
- Вызовите каждую функцию внутри одного
lifecycleScope.launch
лямбда-выражения - Используйте несколько
lifecycleScope.launch
функций для каждой функции приостановки
Меняется ли поведение?
Ответ №1:
При каждом вызове CoroutineScope.launch
создается и запускается новая сопрограмма без блокировки текущего потока и возвращает ссылку на сопрограмму в качестве задания.
Итак, чтобы ответить на ваши вопросы:
- Эти функции приостановки будут выполняться в одной сопрограмме. Что это значит? Это означает, что их порядок выполнения будет последовательным.
lifecycleScope.launch {
invokeSuspend1() // This will be executed first
invokeSuspend2() // Then this will be excuted
}
Сначала invokeSuspend1()
выполняется, и когда это будет сделано, invokeSuspend2()
выполняется.
- Использование нескольких
CoroutineScope.launch
функций для каждой функции приостановки приведет к созданию нескольких сопрограмм, которые делают каждую функцию приостановки независимой друг от друга. Таким образом, порядок выполнения непредсказуем.
lifecycleScope.launch {
invokeSuspend1()
}
lifecycleScope.launch{
invokeSuspend2()
}
// What is the order of invokeSuspend1 and invokeSuspend2? You'll never know
В случае, если функции требуют выполнения результата другой операции, я рекомендую вам использовать одну сопрограмму, чтобы их выполнение было последовательным.
Ответ №2:
Это зависит от того, что пытаются эти функции. Если они зависят от результата другой функции приостановки, запустите их все в рамках одного задания запуска.
Если некоторые из них могут выполняться асинхронно, оберните эти вызовы функций в асинхронный блок.
В случае, если задание должно начаться в определенном состоянии жизненного цикла, вы можете использовать удобные библиотеки жизненного цикла, чтобы у вас был доступ к launchWhenCreated
launchWhenResumed
или launchWhenStarted
.