Вызов нескольких функций приостановки в Activity / Fragment

#android #kotlin #kotlin-coroutines #android-architecture-components

#Android #kotlin #kotlin-сопрограммы #android-архитектура-компоненты

Вопрос:

Какой подход рекомендуется при вызове нескольких функций приостановки внутри activity или fragment? (Для некоторых функций требуется результат другой операции)

  1. Вызовите каждую функцию внутри одного lifecycleScope.launch лямбда-выражения
  2. Используйте несколько lifecycleScope.launch функций для каждой функции приостановки

Меняется ли поведение?

Ответ №1:

При каждом вызове CoroutineScope.launch создается и запускается новая сопрограмма без блокировки текущего потока и возвращает ссылку на сопрограмму в качестве задания.

Итак, чтобы ответить на ваши вопросы:

  1. Эти функции приостановки будут выполняться в одной сопрограмме. Что это значит? Это означает, что их порядок выполнения будет последовательным.
 lifecycleScope.launch {
    invokeSuspend1() // This will be executed first
    invokeSuspend2() // Then this will be excuted
}
  

Сначала invokeSuspend1() выполняется, и когда это будет сделано, invokeSuspend2() выполняется.

  1. Использование нескольких CoroutineScope.launch функций для каждой функции приостановки приведет к созданию нескольких сопрограмм, которые делают каждую функцию приостановки независимой друг от друга. Таким образом, порядок выполнения непредсказуем.
 lifecycleScope.launch {
    invokeSuspend1()
}

lifecycleScope.launch{
    invokeSuspend2()
}

// What is the order of invokeSuspend1 and invokeSuspend2? You'll never know
  

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

Ответ №2:

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

Если некоторые из них могут выполняться асинхронно, оберните эти вызовы функций в асинхронный блок.

В случае, если задание должно начаться в определенном состоянии жизненного цикла, вы можете использовать удобные библиотеки жизненного цикла, чтобы у вас был доступ к launchWhenCreated launchWhenResumed или launchWhenStarted .