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