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