【问题标题】:android: ConcurrentModificationException with map overlaysandroid:带有地图叠加层的 ConcurrentModificationException
【发布时间】:2012-01-23 15:23:23
【问题描述】:

我尝试在其他线程中查找此问题并将我在那里找到的解决方案应用于我自己的问题,但似乎没有任何效果。所以这里是:

在我的一个类中,它创建了一个新的多边形叠加层:

 public void addPolyLines(ArrayList<KrollDict> polyLines){
    // Remove the line overlay
    List<Overlay> mMapOverlays = view.getOverlays();
    boolean rm = mMapOverlays.remove(polyLineOverlay);    

    polyLineOverlay = new PolygonOverlay(polyLines); // KEY LINE

    mMapOverlays.add(polyLineOverlay);
    view.invalidate();
}

这些是我的 PolygonOverlay 课程的核心。在 while(it.hasNext()) 行引发了一个并发修改异常,我不知道为什么。我不相信我正在修改 mPolyLines 数组。 drawLines 是从 Overlays 原生的 draw 方法中调用的,有时看起来像是在不停地调用。

ArrayList<KrollDict> mPolyLines;

public PolygonOverlay(ArrayList<KrollDict> polyLines){
        mPolyLines = polyLines;
}

public void drawLines(MapView mv, Canvas canvas) {
        Iterator<KrollDict> it = mPolyLines.iterator();

        // Go through each line
        while(it.hasNext()){// CONCURRENTMODIFICATIONEXCEPTION THROWN HERE
            KrollDict kd = it.next();
            String[] pointsArr = kd.getStringArray("points");
            String color = kd.getString("color");
            float width = new Float(kd.getDouble("width")).floatValue(); 
            int alpha = kd.getInt("alpha");

            int x1 = -1, y1 = -1, x2 = -1, y2 = -1;
            Paint paint = new Paint();
            paint.setColor(Color.parseColor(color));
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(width);
            //paint.setAlpha(alpha);

            // Loop through the coordinates
            for(int i = 0; i< pointsArr.length; i++){
                String[] coordinates = convertStringToArray(pointsArr[i]);
                Double latitude = new Double(Double.parseDouble(coordinates[3]) * 1E6);
                Double longitude = new Double(Double.parseDouble(coordinates[1]) * 1E6);
                GeoPoint gp = new GeoPoint(latitude.intValue(), longitude.intValue());                                      

                Point point = new Point();
                point = mv.getProjection().toPixels(gp, point);                 

                x2 = point.x;
                y2 = point.y;
                if (i > 0) {                        
                    canvas.drawLine(x1, y1, x2, y2, paint);
                }
                x1 = x2;
                y1 = y2;
            }
        }// while
    }

【问题讨论】:

  • 我认为您发布的代码没有任何问题。猜测很疯狂,但也许您认为叠加层正在迭代它自己的 ArrayList 的私有副本,并且您正在其他地方更新一个单独的副本(可能在另一个线程上),而它们实际上是同一个对象。这可能吗?
  • 完全有可能。我从该 ArrayList 添加/删除的唯一其他地方是在另一个类中,该类在另一个线程中,但它仅在用户按下添加/删除按钮时发生,之后所有这些代码都被调用。你认为可能是这样吗?我以为他们是一个接一个的叫...

标签: java android google-maps overlay


【解决方案1】:

试试

public PolygonOverlay(ArrayList<KrollDict> polyLines){  
    mPolyLines = (ArrayList<KrollDict>)polyLines.clone();  
}   

通过进行克隆,您应该可以安全地防止有人在您迭代列表时更改列表。

【讨论】:

  • 或者使用复制构造函数:mPolyLines = new ArrayList&lt;KrollDict&gt;(polyLines),保存演员表。
猜你喜欢
  • 1970-01-01
  • 2012-05-23
  • 2011-12-07
  • 2020-10-05
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多