3

我试图在我的项目中摆脱 RxJava2 并用 kotlin 协程替换它。我 90% 的 RxJava 代码不再存在,但我仍然无法替换一个网络请求。用户可以在我的应用程序中将照片发送到后端(使用改造的多部分表单数据请求)。如果照片尚未加载,用户也可以取消照片上传。使用 RxJava,我能够保留上传请求的 Disposable 对象,如果尚未处理,如果用户单击取消上传按钮,我可以处理它。由于此操作,网络请求也被取消。所以我们可以节省一些用户流量和电池。是否可以使用 kotlin 协程实现相同的逻辑?在官方文档中,协程取消是合作的,我们需要在循环中(或在文件部分发送之间)使用一些挂起函数来停止协程。

4

1 回答 1

2

如果您正在为您的网络调用使用改造,您可以从这里添加他们的协程调用适配器。

您通过取消它的工作来取消协程的运行部分。例如,如果您正在使用launch启动协程,它会返回一个Job可以取消的对象。

val job = launch {
        repeat(1000) { i ->
            println("I'm sleeping $i ...")
            delay(500L)
        }
    }
    delay(1300L) // delay a bit
    println("main: I'm tired of waiting!")
    job.cancel() // cancels the job
    job.join() // waits for job's completion 
    println("main: Now I can quit.")

如果您不使用改造并使用另一个库,您可以isActive在协程内部检索并取消来自您的库的请求。

fun main(args: Array<String>) = runBlocking<Unit> {
    val startTime = System.currentTimeMillis()
    val job = launch {
        var nextPrintTime = startTime
        var i = 0
        while (isActive) { // cancellable computation loop
            // print a message twice a second
            if (System.currentTimeMillis() >= nextPrintTime) {
                println("I'm sleeping ${i++} ...")
                nextPrintTime += 500L
            }
        }
    }
    delay(1300L) // delay a bit
    println("main: I'm tired of waiting!")
    job.cancelAndJoin() // cancels the job and waits for its completion
    println("main: Now I can quit.")
}
于 2018-05-29T05:48:33.747 回答