对 SynchronizedMap 和同步块的添加或删除
Addition or removal to SynchronizedMap, and synchronized blocks
我正在使用 AWS Android SDK 将图像文件上传到 S3 存储桶。我在裁剪完成后开始传输图像文件的线程中进行裁剪操作。我将所有 TransferObserver 实例保存在一个 Map 中,如下定义和初始化:
private Map<String, TransferObserver> transferObservers;
A() {
transferObservers = Collections.synchronizedMap(new LinkedHashMap<String, TransferObserver>());
}
public void add(Image image) {
handler.post(new Runnable() {
@Override
public void run() {
// Cropping
...
TransferObserver uploadObserver = transferUtility.upload(key, new File(localFilePath));
uploadObserver.setTransferListener(new TransferListener() {
photoTransferObservers.put(image.getPath(), uploadObserver);
}
}
}
图像可以被删除,因此它在地图中的条目:
public void deleteTransferRecord(String key) {
transferObservers.remove(key);
}
还有一个功能是returns整个上传过程:
private void notifyListeners() {
int completedUploadCount = 0;
for (TransferObserver transferObserver : transferObservers.values()) {
if (transferObserver.getState() == TransferState.COMPLETED) {
completedUploadCount++;
}
}
...
}
我在 transferObservers
的迭代过程中遇到了一个关于移除尝试的异常——我没有注意到这一点。我应该如何更新我的代码以防止任何并发问题?
您可以在 transferObservers
访问它的任何地方进行同步(无论是添加、删除还是读取)。那时你不需要 Collections.synchronizedMap
.
或者,更简单的解决方案可能是在 notifyListeners
中迭代之前简单地复制值。这样移除或添加到转移观察者不会在迭代时导致 ConcurrentModificationException
。
private void notifyListeners() {
int completedUploadCount = 0;
List<TransferObserver> observers = new ArrayList<>(transferObservers.values());
for (TransferObserver transferObserver : observers) {
if (transferObserver.getState() == TransferState.COMPLETED) {
completedUploadCount++;
}
}
...
}
我正在使用 AWS Android SDK 将图像文件上传到 S3 存储桶。我在裁剪完成后开始传输图像文件的线程中进行裁剪操作。我将所有 TransferObserver 实例保存在一个 Map 中,如下定义和初始化:
private Map<String, TransferObserver> transferObservers;
A() {
transferObservers = Collections.synchronizedMap(new LinkedHashMap<String, TransferObserver>());
}
public void add(Image image) {
handler.post(new Runnable() {
@Override
public void run() {
// Cropping
...
TransferObserver uploadObserver = transferUtility.upload(key, new File(localFilePath));
uploadObserver.setTransferListener(new TransferListener() {
photoTransferObservers.put(image.getPath(), uploadObserver);
}
}
}
图像可以被删除,因此它在地图中的条目:
public void deleteTransferRecord(String key) {
transferObservers.remove(key);
}
还有一个功能是returns整个上传过程:
private void notifyListeners() {
int completedUploadCount = 0;
for (TransferObserver transferObserver : transferObservers.values()) {
if (transferObserver.getState() == TransferState.COMPLETED) {
completedUploadCount++;
}
}
...
}
我在 transferObservers
的迭代过程中遇到了一个关于移除尝试的异常——我没有注意到这一点。我应该如何更新我的代码以防止任何并发问题?
您可以在 transferObservers
访问它的任何地方进行同步(无论是添加、删除还是读取)。那时你不需要 Collections.synchronizedMap
.
或者,更简单的解决方案可能是在 notifyListeners
中迭代之前简单地复制值。这样移除或添加到转移观察者不会在迭代时导致 ConcurrentModificationException
。
private void notifyListeners() {
int completedUploadCount = 0;
List<TransferObserver> observers = new ArrayList<>(transferObservers.values());
for (TransferObserver transferObserver : observers) {
if (transferObserver.getState() == TransferState.COMPLETED) {
completedUploadCount++;
}
}
...
}