在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 彼此独立并且可以并行运行,它就可以工作。 然后你将它们发送到协程,最后等待每个完成。 你不会在意执行顺序 。
这些想法独立于协程,对于每个并发编程风格都是有效的。