android ConcurrentmodificationException?

时间:2018-04-19 02:16:42

标签: java android arraylist

@Override
public void bleDataReceiverObserver(BluetoothDevice bluetoothDevice) {
    Log.v("bleDataReceiverObserver", bluetoothDevice.getName());
    if (list.size() == 0)
        list.add(new BleData(bluetoothDevice, bluetoothDevice.getAddress(), bluetoothDevice.getName()));
    for (BleData bleData : list) {
        if (bleData.getAddress().equals(bluetoothDevice.getAddress())) {
            break;
        } else
            list.add(new BleData(bluetoothDevice, bluetoothDevice.getAddress(), bluetoothDevice.getName()));
    }
}

蓝牙扫描结果直接通过接收器接收。然而,进入和保存到列表的速度是如此之快以至于异常。我该怎么办?

4 个答案:

答案 0 :(得分:0)

来自oracle docs

  

当不允许进行此类修改时,检测到并发修改对象的方法可能抛出此异常。

在循环中访问List项时,不允许编辑该列表。您正在循环中将项添加到列表中。如果您确实需要它,或者找不到任何解决方案,请使用其他List添加项目

检查this主题以了解详情。

您可以使用此代码:

  boolean isFound = false;
  for (BleData bleData : list) {
    if (bleData.getAddress().equals(bluetoothDevice.getAddress())) {
        isFound = true;
    }
  } 

  if(!isFound){
       bluetoothDevice.getAddress(), bluetoothDevice.getName()));
  }

答案 1 :(得分:0)

只需使用CopyOnWriteArrayList而不是ArrayList。解决ConcurrentModificationException的最简单方法。

像这样:

List<String> list = new CopyOnWriteArrayList<>();

答案 2 :(得分:0)

您无法在for循环中修改和遍历相同的列表。按如下方式更改方法:

@Override
public void bleDataReceiverObserver(BluetoothDevice bluetoothDevice) {
    Log.v("bleDataReceiverObserver", bluetoothDevice.getName());
    if (list.size() == 0)
        list.add(new BleData(bluetoothDevice, bluetoothDevice.getAddress(), bluetoothDevice.getName()));
    for (BleData bleData : list) {
        if (bleData.getAddress().equals(bluetoothDevice.getAddress())) {
            //Do some action on match
            break;
        } 
    }
}

答案 3 :(得分:0)

您正在迭代ArrayList并同时修改它。这会导致ConcurrentModificationException,所以不要这样做。建立一个列表的“影子”副本,其中包含你想要的所有内容,然后在原始列表中调用removeAll()然后调用addAll(newList),在循环中修改新的卷影副本