gpt4 book ai didi

java - 从修改覆盖中解决 ConcurrentModificationException

转载 作者:行者123 更新时间:2023-11-30 03:52:44 25 4
gpt4 key购买 nike

我一直在尝试修复导致间歇性 ConcurrentModificationException 的错误。发生的事情是我有大量的地理点与 ItemizedOverlay 一起显示。然而,本地图移动时,我试图清除所有当前的叠加项(地理点)并用适合新 View 窗口的新点替换它们。

因此,我有一个回调函数可以清除旧的叠加层并用新的叠加层替换它们。我认为我的错误源于多个线程试图同时执行此操作。相关部分如下。我对叠加层和此类工作在低级别上的工作方式了解非常有限,所以我想知道是否有人可以确认(或反驳)这可能会导致问题。

//first clear out the old overlays
List<Overlay> mapOverlays = mapView.getOverlays();
mapOverlays.clear();

//create the new overlays, each initialized with appropriate Drawables
MenuOverlay lowOverlay = new MenuOverlay(this, lowRisk);//(all valid Drawables)
MenuOverlay medOverlay = new MenuOverlay(this, medRisk);
MenuOverlay highOverlay = new MenuOverlay(this, highRisk);

//populate the overlays

//add the new overlays into the list of overlays
mapOverlays.add(lowOverlay);
mapOverlays.add(medOverlay);
mapOverlays.add(highOverlay);

//make the map refresh; this operation has to be pushed to another thread
Runnable runnable = new Runnable() {
public void run() {
mapView.invalidate();
}
};
runOnUiThread(runnable);

我试着让这个方法同步,但错误仍然发生。这可能是由于新的可运行对象在前一个可运行对象终止之前被推送到 UI 线程而引起的吗?我看到有人提到填充是比无效更好的方法,尽管我不完全确定它们有何不同。有什么解决办法吗?

最佳答案

修改覆盖集应该始终在 UI 线程上完成。 getOverlays() 返回的ListMapView 所有,它可以随时决定查看或操作列表。

由于您正在处理大量地理点,您的后台线程很可能正在清除(或添加)叠加层,而 MapView 在 UI 线程上迭代它们。这将触发 ConcurrentModificationException,因为迭代器在其底层覆盖集发生变化时失效。有时 UI 线程不会立即看到更改,因此崩溃是间歇性的。

设置叠加层通常是此类工作流程中较慢的部分。为避免并发修改,您可以在后台线程中设置叠加层,然后在 中对 clear()add() 进行所有调用>可运行。 (另一种选择是使用 AsyncTask。)

例如:

// Slow setup steps
final MenuOverlay lowOverlay = new MenuOverlay(this, lowRisk);
final MenuOverlay medOverlay = new MenuOverlay(this, medRisk);
final MenuOverlay highOverlay = new MenuOverlay(this, highRisk);

Runnable runnable = new Runnable() {
public void run() {
// Anything that touches UI widgets (map, overlay set, views, etc.)
List<Overlay> mapOverlays = mapView.getOverlays();
mapOverlays.clear();

mapOverlays.add(lowOverlay);
mapOverlays.add(medOverlay);
mapOverlays.add(highOverlay);

mapView.invalidate();
}
};

runOnUiThread(runnable);

关于java - 从修改覆盖中解决 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13907747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com