То есть метод callOnlyWhenJobAboveIsDone () будет вызываться только после завершения doSomethingHere ().Это правильно?
Да.
Может кто-нибудь объяснить дальнейшее использование case для job.join ()?
В вашем случае на самом деле нет необходимости в другой работе, вы можете просто написать:
scope.launch {
doSomethingHere()
callOnlyWhenJobAboveIsDone()
}
Это будет делать то же самое, так что на самом деле это не случай использованиядля работы.Теперь есть другие случаи, когда .join()
действительно полезен.
1) Вы хотите запустить (запустить) несколько асинхронных действий параллельно и дождаться завершения всех из них:
someData
.map { Some.asyncAction(it) } // start in parallel
.forEach { it.join() } // wait for all of them
2) Вы должны отслеживать асинхронное состояние, например, обновление:
var update = Job()
fun doUpdate() {
update.cancel() // don't update twice at the same time
update = launch {
someAsyncCode()
}
}
Теперь, чтобы убедиться, что было выполнено последнее обновление, например, если вы хотите использовать некоторые обновленные данные,вы можете просто:
update.join()
где угодно, вы также можете
update.cancel()
, если хотите.
Что действительно полезно в launch {}
, так это то, что он не тольковозвращает задание, но также прикрепляет задание к CoroutineScope.Благодаря этому вы можете отслеживать все асинхронные действия, происходящие внутри вашего приложения.Например, в вашем пользовательском интерфейсе вы можете заставить каждый элемент расширять CoroutineScope, затем вы можете просто отменить область, если элемент покидает визуализированную область, и все обновления / анимации в нем будут остановлены.