gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:23:15 25 4
gpt4 key购买 nike

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

最佳答案

如果你正在为你的网络调用使用改造,你可以从 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.")
}

关于android - 取消文件上传(改造)从协程kotlin android开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50552373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com