目前,我有这段代码。
如果用户停留在相同的分片上,我将从API中获得apiGetObject
,并希望通过resetTime - current
进行续订(请注意,该值将始终为3分钟)。
这段代码将needReload.value = true
延迟了一段时间。
GlobalScope.launch(Dispatchers.Main) {
apiGetObject.value?.resetTime?.let {
if (it - System.currentTimeMillis() > 0) {
delay(it - System.currentTimeMillis())
}
}
needReload.value = true
}
现在,我在每个onResume
上检索对象以刷新数据(这是必须的)。因此,如果在3分钟窗口内恢复“碎片”,则会启动另一个协程。
=>这样就可以制作数据
我想要什么:
我想如果有新的协程发射,那么前一个被取消/销毁。无论如何,有这种方法吗(欢迎使用此协程的其他解决方案)
注意:我将MVVM与LiveData结合使用,并且我获得了apiGetObject
以及翻新和RX
答案 0 :(得分:1)
要取消协程,可以保留启动协程时返回的'Job'对象的引用,当要停止该协程时,可以调用'job.cancel()'
就您而言,
首先为job创建一个全局变量
var job : Job? = null
以及启动协程时
job?.cancel()
job = GlobalScope.launch(Dispatchers.Main) {
apiGetObject.value?.resetTime?.let {
if (it - System.currentTimeMillis() > 0) {
delay(it - System.currentTimeMillis())
}
}
needReload.value = true
}
因此在这里,在启动协程之前,我们将取消前一个协程。