Android MapView在长时间使用后损坏

时间:2012-03-03 02:52:23

标签: android google-maps android-mapview

我有一个带有MapView的Android应用程序,它可以连续运行几个小时,用户手机上的用户交互最少。我发现,经过一段时间后,MapView会发生一些事情,使它变得完全无法使用。

应用程序不会崩溃,地图仍然存在,但它似乎已损坏。捏/滚动地图会导致瓷砖摇晃并飞来飞去,并且标记会随机弹跳。这听起来像是有人遇到过的吗?

编辑:以下代码大约每10秒运行一次:

public void updateMarkers(boolean centerMap) 
{
    log("updateMarkers(" + centerMap + ")");
    int vehicLat = (int) (AppState.getLatitude() * 1e6);
    int vehicLng = (int) (AppState.getLongitude() * 1e6);
    GeoPoint vehiclePoint = new GeoPoint(vehicLat, vehicLng);

    List<Overlay> currentOverlays = mapView.getOverlays();
    if(!currentOverlays.isEmpty()) 
    { 
        currentOverlays.clear();
        mapView.postInvalidate();
    }

    Drawable drawable = getResources().getDrawable(R.drawable.car);
    MapOverlay iconOverlay = new MapOverlay(drawable, this);
    OverlayItem iconPoint = new OverlayItem(vehiclePoint, "", "");
    iconOverlay.addOverlay(iconPoint);
    currentOverlays.add(iconOverlay);

    if(centerMap)
    {
        mapController.setCenter(vehiclePoint);
        mapController.setZoom(17);
    }


    mapView.postInvalidate();
}

1 个答案:

答案 0 :(得分:1)

假设错误出现在该部分代码中,问题很可能是:

 Drawable drawable = getResources().getDrawable(R.drawable.car);
 MapOverlay iconOverlay = new MapOverlay(drawable, this);

当你真正需要时,你正在制作一个可绘制的对象1.在我使用Android的经验中,drawables(和Bitmaps)上的垃圾收集非常差(如果你读得足够多,你会开始怀疑如果真的坏了......)。这就是我要做的事情:

  1. 在课堂上拉一次抽奖。存放可绘制的 - 不要每10秒钟拉一次。
  2. 在清除currentOverlays列表之前,请将每个事物的drawable设置为null
  3. 示例:

    List<Overlay> currentOverlays = mapView.getOverlays();
    if(!currentOverlays.isEmpty()) 
    { 
      for(Overlay o : currentOverlays)
      {
          // You need to a typecast here I think
          o.setDrawable(null);
      }
      currentOverlays.clear();    
      mapView.postInvalidate();
    }