Fix ConcurrentModificationException

This CL use CopyOnWriteArrayList to avoid
ConcurrentModificationException.

Bug: 152188749
Test: build pass
Change-Id: Icfdcef703cb7f7ac21233c0f2b4bf5111121630a
This commit is contained in:
hughchen
2020-03-25 18:12:52 +08:00
committed by Robert Luo
parent 0fdf17d06b
commit 37282f0f02

View File

@@ -68,9 +68,9 @@ public class LocalMediaManager implements BluetoothCallback {
private String mPackageName;
@VisibleForTesting
List<MediaDevice> mMediaDevices = new ArrayList<>();
List<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>();
@VisibleForTesting
List<MediaDevice> mDisconnectedMediaDevices = new ArrayList<>();
List<MediaDevice> mDisconnectedMediaDevices = new CopyOnWriteArrayList<>();
@VisibleForTesting
MediaDevice mPhoneDevice;
@VisibleForTesting
@@ -206,6 +206,7 @@ public class LocalMediaManager implements BluetoothCallback {
public void stopScan() {
mInfoMediaManager.unregisterCallback(mMediaDeviceCallback);
mInfoMediaManager.stopScan();
unRegisterDeviceAttributeChangeCallback();
}
/**
@@ -392,32 +393,34 @@ public class LocalMediaManager implements BluetoothCallback {
}
private List<MediaDevice> buildDisconnectedBluetoothDevice() {
for (MediaDevice device : mDisconnectedMediaDevices) {
((BluetoothMediaDevice) device).getCachedDevice()
.unregisterCallback(mDeviceAttributeChangeCallback);
}
mDisconnectedMediaDevices.clear();
final List<BluetoothDevice> bluetoothDevices =
mBluetoothAdapter.getMostRecentlyConnectedDevices();
final CachedBluetoothDeviceManager cachedDeviceManager =
mLocalBluetoothManager.getCachedDeviceManager();
final List<CachedBluetoothDevice> cachedBluetoothDeviceList = new ArrayList<>();
for (BluetoothDevice device : bluetoothDevices) {
final CachedBluetoothDevice cachedDevice =
cachedDeviceManager.findDevice(device);
if (cachedDevice != null) {
if (cachedDevice.getBondState() == BluetoothDevice.BOND_BONDED
&& !cachedDevice.isConnected()) {
final MediaDevice mediaDevice = new BluetoothMediaDevice(mContext,
cachedDevice,
null, null, mPackageName);
if (!mMediaDevices.contains(mediaDevice)) {
cachedDevice.registerCallback(mDeviceAttributeChangeCallback);
mDisconnectedMediaDevices.add(mediaDevice);
}
cachedBluetoothDeviceList.add(cachedDevice);
}
}
}
unRegisterDeviceAttributeChangeCallback();
mDisconnectedMediaDevices.clear();
for (CachedBluetoothDevice cachedDevice : cachedBluetoothDeviceList) {
final MediaDevice mediaDevice = new BluetoothMediaDevice(mContext,
cachedDevice,
null, null, mPackageName);
if (!mMediaDevices.contains(mediaDevice)) {
cachedDevice.registerCallback(mDeviceAttributeChangeCallback);
mDisconnectedMediaDevices.add(mediaDevice);
}
}
return new ArrayList<>(mDisconnectedMediaDevices);
}
@@ -468,6 +471,12 @@ public class LocalMediaManager implements BluetoothCallback {
}
}
private void unRegisterDeviceAttributeChangeCallback() {
for (MediaDevice device : mDisconnectedMediaDevices) {
((BluetoothMediaDevice) device).getCachedDevice()
.unregisterCallback(mDeviceAttributeChangeCallback);
}
}
/**
* Callback for notifying device information updating