Android MapView поврежден после длительного использования - PullRequest
0 голосов
/ 03 марта 2012

У меня есть приложение для Android с MapView, и оно работает непрерывно в течение нескольких часов при минимальном взаимодействии с пользователем на его телефонах.Я обнаружил, что через некоторое время с MapView может случиться что-то, что сделает его полностью непригодным для использования.

Приложение не падает, и карта все еще там, но кажется, что она повреждена.Сжатие / прокрутка карты заставляет плитки трястись и летать, а маркеры отскакивают случайным образом.Звучит ли это как что-то, с чем кто-либо сталкивался?

edit: следующий код запускается примерно каждые 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 Ответ

1 голос
/ 03 марта 2012

Если предположить, что ошибка в этом разделе кода, проблема, вероятно, такова:

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

Вы создаете миллиард нарисованных объектов, когда вам действительно нужно только 1. По моему опыту с Android,сборка мусора на рисованных объектах (и растровых изображениях) довольно скудна (если вы прочитаете об этом достаточно, вы начнете задумываться, действительно ли она сломана ...).Вот что я бы сделал:

  1. Потяните один раз в классе.Сохраняйте отрисовку - не тяните ее каждые 10 секунд.
  2. Прежде чем очистить список currentOverlays, установите для отрисовки на каждой вещи значение null.

Пример:

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();
}
...