Я был kotlin docs, и если я правильно понял, две функции kotlin работают следующим образом:
withContext(context)
: переключает контекст текущей сопрограммы; при выполнении данного блока сопрограмма возвращается в предыдущий контекст.async(context)
: запускает новую сопрограмму в заданном контексте, и если мы вызовем.await()
для возвращенной задачиDeferred
, она приостановит вызывающую сопрограмму и возобновит работу, когда блок, выполняющийся внутри порожденной сопрограммы, вернется.
Теперь для следующих двух версий code
:
Version1:
launch(){
block1()
val returned = async(context){
block2()
}.await()
block3()
}
Version2:
launch(){
block1()
val returned = withContext(context){
block2()
}
block3()
}
- В обеих версиях block1(), block3() выполняются в контексте по умолчанию (commonpool?), Где block() выполняется в данном контексте.
- Общее выполнение синхронно с порядком block1() → block2() → block3().
- Единственное отличие, которое я вижу, состоит в том, что версия 1 создает другую сопрограмму, в то время как версия 2 выполняет только одну сопрограмму при переключении контекста.
Мои вопросы:
Разве не всегда лучше использовать
withContext
, чемasync-await
, так как он функционально похож, но не создает другую сопрограмму. Большое количество сопрограмм, хотя и легковесное, все еще может быть проблемой в требовательных приложениях.Есть ли случай, когда
async-await
более предпочтителен, чемwithContext
?
Обновление:
Kotlin 1.2.50 теперь имеет проверку кода, где он может конвертировать async(ctx) { }.await() to withContext(ctx) { }
.