目前我有这段代码。
如果用户停留在同一个片段上,我将从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分钟窗口下被恢复,另一个协同线将被发射。
=> --这使得数据
我想要的:
我想,如果有一个新的协同线发射,那么前一个是取消/摧毁。是否有这样做的(其他解决方案,这个协同线是受欢迎的)
注意:我在LiveData中使用MVVM,我得到了带有Retrofit和RX的apiGetObject
发布于 2019-07-24 09:22:11
为了取消一个协同线,您可以在启动coroutine时保留返回的'Job‘对象的引用,并且当您想停止该协同线时,您可以调用'job.cancel()’
在你的情况下
首先为作业创建一个全局变量
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
}因此,在启动协同线之前,如果存在,我们将取消前一个协同线。
https://stackoverflow.com/questions/57166494
复制相似问题