@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()));
}
}
蓝牙扫描结果直接通过接收器接收。然而,进入和保存到列表的速度是如此之快以至于异常。我该怎么办?
答案 0 :(得分:0)
当不允许进行此类修改时,检测到并发修改对象的方法可能抛出此异常。
在循环中访问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),在循环中修改新的卷影副本