首页 > 解决方案 > 与函数参数一起使用的 Android Kotlin 协程行为奇怪

问题描述

我正在使用协程来格式化列表。

这是它的样子

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 循环不了解的地方吗?

标签: androidcoroutine

解决方案


使您的代码可取消

要使 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.


推荐阅读