取消文件上传(改造)从coroutine kotlin android开始

时间:2018-05-27 12:56:45

标签: android networking kotlin kotlinx.coroutines

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

1 个答案:

答案 0 :(得分:2)

如果您正在为网络电话使用改造,可以从here添加他们的协同呼叫适配器。

通过取消协同工作来取消协程的运行部分。例如,如果您使用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.")
}