android java.util.ConcurrentModificationException中的奇怪错误

时间:2016-10-27 05:30:33

标签: java android multithreading arraylist

大家好我有一个小问题。我正在为Android编写一个应用程序,我有一部分代码就像这样。

public void loop(){

   for(Car car:carList)
        car.run();

}

我收到错误 java.util.ConcurrentModificationException 我也尝试使用迭代器来快速解决问题。 此外,我使用 synchronized ,因为我检查了oracle文档中的错误,并且它说可能是由许多使用相同代码的线程引起的。

public synchronized void loop(){
 Iterator<Car> carIterator = carList.iterator();
 while(cardIterator.hasNext()){
  carIterator.next().run();
 }
}

我真的不知道为什么我找到的任何解决方案都不起作用。我在后台服务中使用了大部分情况下的这部分代码,并且我也使用了包含该方法的类(使用单例)。 在此先感谢所有的社区

感谢支持人员, -carList是Car对象的ArrayList。 我的车类是这样的

public class Car{
   private int mSpeed;
   private int mDistance; //zero at first
    ........
   public void run(){
       mSpeed=getRandomSpeed();
       mDistance+=mSpeed;
       updateDistanceInDB();//here I sabe the distance in DB using a DB helper
   }
   .........   

}

- 错误表示它是在执行方法运行的行中生成的 有一些奇怪的东西,因为该应用程序在我拥有的另一台设备上运行良好。

1 个答案:

答案 0 :(得分:2)

解决此异常的最强力方法是使用CopyOnWriteArrayList代替您当前的List。这将确保在迭代期间不会看到for-each循环期间对列表的任何更新,因此不会抛出ConcurrentModificationException

根据其文件:

  

“snapshot”样式迭代器方法在创建迭代器时使用对数组状态的引用。这个数组在迭代器的生命周期内永远不会改变,所以干扰是不可能的,并且保证迭代器不会抛出ConcurrentModificationException

但是,根据具体情况,可能有更好的方法来解决您的问题。查看代码的哪些部分对List进行修改,并确保它们在迭代期间不运行。