#android #kotlin #kotlin-coroutines
#Android #kotlin #kotlin-сопрограммы
Вопрос:
итак, я просматривал сопрограммы в течение последних нескольких дней и нашел довольно интересный фрагмент кода
val input = MutableStateFlow(5)
lifecycleScope.launch {
input.collectLatest {
val job = launch {
doSomething1()
delay(1000L)
doSomething2()
}
job.join()
}
}
Я отлаживал его, и я не уверен, зачем нам это нужно job.join
, как я понимаю весь поток прямо сейчас:
Допустим, мы быстро вводим 3 значения в input
, collectLatest
завершаем предыдущее незавершенное поле, но поскольку мы запускаем новую сопрограмму, ее задание не завершается, поэтому после быстрого ввода 3 значений мы всегда будем достигать doSomething2
каждого значения, если мы пропустим launch
внутри collectLatest
, мы достигнем только одного doSomething2
, но теперь переходим к job.join
— itследует приостановить сопрограмму до тех пор, пока работа не будет выполнена, но поскольку мы больше ничего не делаем в этой сопрограмме, действительно ли это нужно? Дает ли это какое-либо значение? Из моих тестов на самом деле не имеет значения, есть ли у нас это job.join
или нет, чего мне здесь не хватает?
Комментарии:
1. Возможно, я ошибаюсь, но похоже, что this job.join() необходим, чтобы просто убедиться, что это задание завершено, прежде чем мы сделаем что-то еще, например, внутри этой функции collectLatest . На самом деле весь этот фрагмент кода выглядит довольно интересно, поскольку нам не нужен collectLatest, если мы все равно работаем с каждым значением. Возможно, Job.cancelAndJoin() будет работать лучше
2. Я думаю, они просто показывают, что вам понадобится эта строка, если вашей сопрограмме предстоит выполнить дополнительную работу после сбора.