取消从协程 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.")
}
我正试图摆脱我项目中的 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.")
}