Каков правильный способ управления маркерами в API Карт Google v2? Я пытаюсь обновить область просмотра только маркерами, которые видны внутри этого региона, и я использую OnCameraChangeListener
, чтобы узнать, когда обновлять область просмотра с помощью последних маркеров. Однако, похоже, что карта не прокручивается/масштабируется всякий раз, когда она рисует или обновляет маркеры. Я заметил, что когда используется setIcon()
, отставание еще хуже. В Google Maps v1 у меня никогда не было этой проблемы, когда я использовал ItemizedOverlays. Вот суть моего кода, который испытывает отставание в прокруткой/масштабированием:android google maps v2 lag при рисовании или обновлении маркеров
private void updatePinsOnMap(MapDisplayData mapDisplayData) {
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(getPinWithBadgeCount(2));
List<LatLng> latlngs = Lists.newArrayList();
for (NearbyPlaceEdge place : mapDisplayData.getPlaces()) {
latlngs.add(place.latlng);
}
for (NearbyPlaceCluster cluster : mapDisplayData.getClusters()) {
latlngs.add(cluster.latlng);
}
int numMarkersToPlot = latlngs.size();
for (int i = 0; i < numMarkersToPlot; i++) {
if (i < mMarkers.size()) {
// recycle
mMarkers.get(i).setPosition(latlngs.get(i));
} else {
final Marker m = mGoogleMap.addMarker(
new MarkerOptions()
.position(latlngs.get(i))
.icon(bitmapDescriptor)
);
mMarkers.add(m);
}
}
for (int i = mMarkers.size() - 1; i >= numMarkersToPlot; i--) {
mMarkers.remove(i).remove();
}
}
UPDATE:
Я создал пример приложения с указанным кодом и вещи работают в соответствии с планом (т.е. не медлительность) , Я потратил некоторое время на размышления об этом, и я считаю, что это имеет какое-то отношение к памяти, которая требуется для Google Maps v2. Глядя на LogCat, каждый раз, когда я двигаюсь карта - который запускает обновление карты - я получаю много сообщений Gc, как это на моем Nexus 4
05-27 14:28:23.701: D/dalvikvm(2849): GC_FOR_ALLOC freed 1198K, 23% free 26889K/34504K, paused 112ms, total 112ms
Это потенциальная утечка памяти в API? Мое существующее приложение уже занимает некоторую память, но я полагаю, что GMaps сможет соответствующим образом управлять собственной памятью на основе того, что доступно.
спасибо за понимание Maciej. однако я не добавляю/удаляю/обновляю очень большое количество контактов. Это примерно 25 маркеров при каждом вызове callbackCameraChangeListener. Я обновляю свой вопрос с дополнительной информацией –
@ VietNguyen обновленный ответ тоже –