Android服务中的Kotlin协程

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的协程,所以我不知道该怎么实现。

提前致谢。

GV_*_*Qst 6

同意@s1m0nw1和他的回答

这是一种很难接近的方式。您所需要的就这么简单:

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)


s1m*_*nw1 5

如果您必须一个接一个地执行它们并且就像您说的那样,它们彼此依赖,那么这不是并行执行的有效用例,就像您在此处使用Coroutines一样。然后按顺序执行。

在您的示例中,您已经分派了所有任务,并在所有任务都已被放弃执行之后,最终等待执行。首先执行哪个是完全随机的。

例如,如果Job1,Job2和Job3 彼此独立并且可以并行运行,则它将起作用然后,您将它们分配给协程,最后等待它们完成。您无需关心执行顺序

这些想法与协程无关,并且对于每种并发编程样式均有效。