取消从协程 kotlin 开始的文件上传(改造)android

Cancel file upload (retrofit) started from coroutine kotlin android

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

如果您正在对网络调用进行改造,您可以从 here 添加他们的协程调用适配器。

您可以通过取消作业来取消协程的 运行 部分。例如,如果您使用 launch 启动协程,它 returns 一个可以取消的 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.")
}