Kotlin Coroutines в службе Android

У меня есть служба Android, которая запускает и синхронизирует различные типы данных с сервером, когда он находится в сети. Я новичок в Kotlin coroutines, и я пытаюсь выполнить следующее:

fun syncData{ //Job1 make retrofit call to server //Job2 make retrofit call to server after job1 is done. //Job3 make retrofit call to server after job 2 is done and so on. //After all jobs are done I'll stop service. } 

Я следую за этим сообщением: Kotlin Coroutines правильный путь в Android

Что принесло мне это решение:

 fun syncData() = async(CommonPool){ try{ val sync1 = async(CommonPool){ job1.sync() } val sync2 = async(CommonPool){ job2.sync() } val sync3 = async(CommonPool){ job3.sync() } val sync4 = async(CommonPool){ job4.sync() } job1.await() job2.await() job3.await() job4.await() }catch (e: Exception){ }finally { stopSelf() } } 

Но когда я получаю журнал регистрации в logcat, каждый вызов смешивается. Звонки с job3 идут до job1 и т. Д. Как я могу выполнить это в конвейере? Я немного потерян в сопрограммах kotlin, поэтому я не знаю точно, как это реализовать.

Заранее спасибо.

Если вы должны выполнять их один за другим и, как вы говорите, они зависят друг от друга, это не допустимый вариант использования для параллельного выполнения, как вы делаете с Coroutines здесь. Просто сделайте это последовательно.

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

Это будет работать, если, например, Job1, Job2 и Job3 не зависят друг от друга и могут работать параллельно. Затем вы отправите каждого из них в Coroutine и в конце концов дождитесь завершения каждого из них. Вам не понравится порядок исполнения .

Эти идеи не зависят от сопрограмм и действительны для каждого параллельного стиля программирования.

Вы можете добавить лень к каждой sync() .

Просто измените реализацию на это:

 fun syncData() = async(CommonPool){ try{ val sync1 = async(coroutineContext, start = CoroutineStart.LAZY){ job1.sync() } val sync2 = async(coroutineContext, start = CoroutineStart.LAZY){ job2.sync() } val sync3 = async(coroutineContext, start = CoroutineStart.LAZY){ job3.sync() } val sync4 = async(coroutineContext, start = CoroutineStart.LAZY){ job4.sync() } job1.await() job2.await() job3.await() job4.await() }catch (e: Exception){ }finally { stopSelf() } } 

Каждое задание не выполняется перед заданием до его выполнения.

Взгляните на сопроводительный справочник .