Abd*_*man 21 android coroutine kotlin kotlin-coroutines coroutinescope
我想实现什么目标?
我有一个下载图像的任务,但随着屏幕滚动,它将取消以前的下载并开始下载新的图像。我希望当它取消coroutine下载上一个图像时,它会立即停止并释放bandwidth新图像,以便更快地下载。
我已经尝试过什么?
我尝试了多种方法来停止,coroutine但即使在取消后,它仍然会继续进行,直到完成下载coroutine。当我取消它时,它会生成coroutine一个变量并停止调用进一步的挂起函数。但问题是,如果它运行多次或从该任务下载图像,除非完成,否则不会取消。Like 循环将完成其迭代,然后协程将被取消。isActivefalseloop1000000network1000000
我已经尝试过这些但没有成功:
job.cancel()
scope.cancel()
Run Code Online (Sandbox Code Playgroud)
我尝试了很多方法来实现这一目标,但没有找到解决方案。我现在无法在我的项目中使用任何库。
这个用例不是通过线程、执行器服务、协程来实现的。因为所有人的行为都是一样的。
更多类似的问题:
AIM*_*PAN 18
Kotlin 协程必须配合才能允许取消。这意味着它有一些检查点调用一个挂起函数。这是有道理的,因为有些过程是原子的,不应该在中间停止。
无法取消的不良协程的一个示例:
var job = launch {
var time = System.currentTimeMillis()
var i = 0
while (i < 1000) {
if (System.currentTimeMillis() >= time) {
println("Loop number ${++i} ")
time += 500
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了使其可取消,您可以在每次迭代开始时添加yield()。以下是一个可取消的协程:
coroutineScope {
var job = launch {
var time = System.currentTimeMillis()
var i = 0
while (i<1000) {
yield()
if (System.currentTimeMillis() >= time) {
println("Loop number ${++i}")
time += 500
}
}
}
// wait some time
delay(1300)
println("Stopping the coroutine....")
job.cancel()
job.join()
// or call job.cancelAndJoin()
}
Run Code Online (Sandbox Code Playgroud)
协程取消是合作性的。协程代码必须配合才能取消。kotlinx.coroutines 中的所有挂起函数都是可以取消的。它们检查协程的取消情况,并在取消时抛出 CancellationException。但是,如果协程正在计算中并且不检查取消,则无法取消它,如下例所示:
val startTime = System.currentTimeMillis()
val job = launch(Dispatchers.Default) {
var nextPrintTime = startTime
var i = 0
while (i < 5) { // computation loop, just wastes CPU
// print a message twice a second
if (System.currentTimeMillis() >= nextPrintTime) {
println("job: 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.")
Run Code Online (Sandbox Code Playgroud)
运行它以查看即使在取消后它也会继续打印“我正在睡觉”,直到作业在五次迭代后自行完成
使计算代码可取消
就像下面的例子所示:
val startTime = System.currentTimeMillis()
val job = launch(Dispatchers.Default) {
var nextPrintTime = startTime
var i = 0
while (isActive) { // cancellable computation loop
// print a message twice a second
if (System.currentTimeMillis() >= nextPrintTime) {
println("job: 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.")
Run Code Online (Sandbox Code Playgroud)
请参阅此处的官方文档
| 归档时间: |
|
| 查看次数: |
30578 次 |
| 最近记录: |