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