У меня проблема с отображением примерно 80 маркеров на карте Google. Я использую Google Maps Android API v2.
Значки маркеров являются динамическими (изменение во времени). После добавления маркера к карте невозможно изменить значок. Поэтому мне нужно удалить все маркеры и снова добавить все маркеры.
mMap.clear();
for (int i = 0; i < teams.length(); i++) {
team = teams.get(i);
point = new LatLng(tema.getLatitude(), team.getLongitude());
MarkerOptions marker = new MarkerOptions().position(point).title(name).icon(BitmapDescriptorFactory.fromResource(team.getMarkerId())));
mMap.addMarker(marker);
}
После выполнения этого кода несколько раз (он обновляется один раз в минуту), я получаю OutOfMemoryExpcetion.
При использовании значков больших значков исключение OutOfMemoryException ускоряется, поэтому я думаю, что проблема с памятью связана с растровым изображением значка, который не перерабатывается должным образом.
Я также понял, что при изменении поворота устройства с ландшафта на portait и назад увеличивается используемая память кучи. После GC память не освобождается.
Кто-нибудь знает, неправильно ли я добавляю маркеры или сталкиваюсь с проблемой в реализации API Карт?
Я попытался воспроизвести ошибку с образцом приложения Google Map. В android-sdk/extras/google/google_play_services/samples/maps/src/com/example/mapdemo/MarkerDemoActivity.java
можно найти маркерную демонстрацию. Ускорение тестирования я увеличил количество созданных маркеров.
int numMarkersInRainbow = 12;
измените на
int numMarkersInRainbow = 100;
Теперь запустите демонстрационное приложение, выберите демонстрацию маркеров и переключите поворот вашего устройства с портрета на пейзаж и обратно несколько раз.
Начальная куча:
Heap size Allocated Free %Used #Objects
11,543 BM 9,898 MB 1,645 MB 85,75% 65.982
Куча после нескольких изменений ориентации:
Heap size Allocated Free %Used #Objects
15,652 MB 11,337 MB 4,316 MB 72,43% 76.984
Куча после нескольких изменений ориентации:
Heap size Allocated Free %Used #Objects
21,312 MB 16,411 MB 4,901 MB 77,00% 111.350
Конечным результатом будет OutOfMemoryExcpetion.
Дамп кучи показывает некоторые возможные утечки кучи: https://www.box.com/s/rsy0k22dcp267se2g1fy
Полный сброс кучи: https://www.box.com/s/6lyv2p6rlc0njqxw5zgu
Обновление: Это похоже на проблему утечки памяти в Android Maps V2. См. https://code.google.com/p/gmaps-api-issues/issues/detail?id=4766 В соответствии с этим вопросом необходимо исправить, но я сам его не тестировал.