如何在仍然允许用户与地图交互的同时将点添加到Google地图视图?

时间:2013-02-20 01:18:53

标签: android android-mapview concurrentmodification

我有一个线程接收从服务器发送的地图点,这些点被添加到MapView。这很好但如果我与MapView进行交互(例如放大,平移等),我会得到ConcurrentModificationException,那么如何在向{{1}添加点的同时允许用户访问}}?

MapView

3 个答案:

答案 0 :(得分:1)

您是否尝试过使用新的地图api?就个人而言,我发现它更容易使用,并且易于从旧API更改为新API。

链接:https://developers.google.com/maps/documentation/android/

我发现特别改进的一件事是在地图上绘图。没有更多的溢出等等。 使用新API添加引脚的示例如下:

    final GoogleMap map = this.getMap();
    final MarkerOptions marker = new MarkerOptions();
    marker.position(latlng);
    marker.draggable(false);
    marker.icon(BitmapDescriptorFactory.fromResource(drawable));
    map.addMarker(marker);

答案 1 :(得分:0)

虽然在后台线程中从服务器接收点是合适的,但实际上应该在UI线程中添加/更新点。这应该可以防止任何并发修改问题。只要添加/更新过程不太重,就不应该显着干扰用户体验。

答案 2 :(得分:0)

我试图提取并清理一些使用旧api的旧代码。 亮点是:

  1. 创建尚未在地图上的叠加层
  2. 绘制并以其他方式准备叠加层
  3. 将叠加层添加到地图
  4. 强制重绘地图
  5. 将此方法添加到您的活动

    // check if overlay we are adding was already added
    final List<Overlay> listOfOverlays = this.mMapView.getOverlays();
    if ((this.mPinsOverlay != null) && listOfOverlays.contains(this.mPinsOverlay))
    {
        listOfOverlays.remove(this.mPickupOverlay);
    }
    
    // create overlay
    this.mPinsOverlay = new PinsOverlay();
    
    // add overlay to map
    listOfOverlays.add(this.mPinsOverlay);
    
    // force map to redraw
    this.mMapView.postInvalidate();
    

    自定义叠加类,不需要但保持整洁。

    public class PinsOverlay extends Overlay
    {
        public PinsOverlay()
        {
            super();
        }
    
        @Override
        public boolean draw(final Canvas canvas, final MapView mapView, final boolean shadow, final long when)
        {
            super.draw(canvas, mapView, shadow);
    
            // draw your pins here
    
            return true;
        }
    }