在Android服务中的Kotlin协程

我有一个android服务,它启动并同步服务器上的不同类型的数据,当它在线。 我是Kotlin协程新手,我试图完成以下任务:

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的协同程序中,所以我不知道如何执行这个。

提前致谢。

如果你必须一个接一个地执行它们,就像你说的那样,它们相互依赖对于并发执行来说 ,这不是一个有效的用例,就像你在这里使用Coroutine一样。 那就按顺序做吧。

在你的例子中,你正在调度所有的任务,并最终等待执行,毕竟所有的任务已经被执行了。 这是完全随机的哪一个会先执行。

例如,如果Job1,Job2和Job3 彼此独立并且可以并行运行,它就可以工作 然后你将它们发送到协程,最后等待每个完成。 你不会在意执行顺序

这些想法独立于协程,对于每个并发编程风格都是有效的。