Android 与函数参数一起使用的 Kotlin 协程表现得很奇怪
Android Kotlin Coroutine used with function parameters acts odd
我正在使用协程来格式化列表。
这是它的样子
val job : Job? = null
private fun formatList(originalList:MutableList<MY_OBJECT>, callback : (MutableList<MY_OBJECT>) -> Unit){
if(job != null && !job?.isCompleted!!){
job?.cancel()
}
job = viewModelScope.launch(Dispatchers.IO) {
originalList.foreach { item ->
//do something with the item.
}
}
}
此方法可以在运行时多次调用,为了避免它做同样的事情,我在作业尚未完成时添加了一个取消调用。
问题是,在运行时,foreach 块中的内容会随机产生一些与索引相关的崩溃。
为什么会这样?这是关于协程执行背后的事情吗?或者关于 foreach 循环有什么我不知道的吗?
Making your code cancellable
为了 job.cancel() 正常工作,您需要使协同程序中的代码可取消。
job = viewModelScope.launch(Dispatchers.IO) {
originalList.foreach { item ->
if(!isActive) return@launch
//do something with the item.
}
if(!isActive) return@launch
// do something
}
此处 if(!isActive) return@launch
行正在检查协程是否仍处于活动状态。在计算密集型代码之前和之后检查 isActive
是一种很好的做法。
注意:如果您不进行任何网络或数据库调用,请始终尝试使用针对计算优化的 Dispatchers.Default
而不是 Dispatchers.IO
。
我正在使用协程来格式化列表。
这是它的样子
val job : Job? = null
private fun formatList(originalList:MutableList<MY_OBJECT>, callback : (MutableList<MY_OBJECT>) -> Unit){
if(job != null && !job?.isCompleted!!){
job?.cancel()
}
job = viewModelScope.launch(Dispatchers.IO) {
originalList.foreach { item ->
//do something with the item.
}
}
}
此方法可以在运行时多次调用,为了避免它做同样的事情,我在作业尚未完成时添加了一个取消调用。
问题是,在运行时,foreach 块中的内容会随机产生一些与索引相关的崩溃。
为什么会这样?这是关于协程执行背后的事情吗?或者关于 foreach 循环有什么我不知道的吗?
Making your code cancellable
为了 job.cancel() 正常工作,您需要使协同程序中的代码可取消。
job = viewModelScope.launch(Dispatchers.IO) {
originalList.foreach { item ->
if(!isActive) return@launch
//do something with the item.
}
if(!isActive) return@launch
// do something
}
此处 if(!isActive) return@launch
行正在检查协程是否仍处于活动状态。在计算密集型代码之前和之后检查 isActive
是一种很好的做法。
注意:如果您不进行任何网络或数据库调用,请始终尝试使用针对计算优化的 Dispatchers.Default
而不是 Dispatchers.IO
。