jul*_*iro 9 android-service async-await kotlin kotlinx.coroutines
我有一个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.
}
Run Code Online (Sandbox Code Playgroud)
我在关注这篇文章: 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()
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我在logcat上获得翻新版的登录信息时,每个电话都混在一起。来自job3的呼叫先于job1,依此类推。我该如何在管道中执行?我有点迷上了Kotlin的协程,所以我不知道该怎么实现。
提前致谢。
这是一种很难接近的方式。您所需要的就这么简单:
val job = SupervisorJob()
fun syncData() = launch(job) {
try {
val result1 = makeRetrofitCall1()
val result2 = makeRetrofitCall2(result1)
...
val resultN = makeRetrofitCallN(resultNMinusOne)
} catch(e: Exception) {
// handle exception
} finally {
stopSelf()
}
}
override fun onDestroy() {
super.onDestroy()
job.cancel()
}
Run Code Online (Sandbox Code Playgroud)
这里的makeRetrofitCall意思是直接调用 API 作为retrofitClient.getData()where retrofitClientis
interface RetrofitClient {
@GET("endpoint")
suspend fun getData(): MyCustomResult
}
Run Code Online (Sandbox Code Playgroud)
如果您必须一个接一个地执行它们,并且就像您说的那样,它们彼此依赖,那么这不是并行执行的有效用例,就像您在此处使用Coroutines一样。然后按顺序执行。
在您的示例中,您已经分派了所有任务,并在所有任务都已被放弃执行之后,最终等待执行。首先执行哪个是完全随机的。
例如,如果Job1,Job2和Job3 彼此独立并且可以并行运行,则它将起作用。然后,您将它们分配给协程,最后等待它们完成。您无需关心执行顺序。
这些想法与协程无关,并且对于每种并发编程样式均有效。
| 归档时间: |
|
| 查看次数: |
1735 次 |
| 最近记录: |