Путаница в объединении заданий сопрограммы Android

#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. Я думаю, они просто показывают, что вам понадобится эта строка, если вашей сопрограмме предстоит выполнить дополнительную работу после сбора.