我有一个线程接收从服务器发送的地图点,这些点被添加到MapView
。这很好但如果我与MapView
进行交互(例如放大,平移等),我会得到ConcurrentModificationException
,那么如何在向{{1}添加点的同时允许用户访问}}?
MapView
答案 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的旧代码。 亮点是:
将此方法添加到您的活动
// 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;
}
}