2013-05-26 3 views
3

Каков правильный способ управления маркерами в 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 сможет соответствующим образом управлять собственной памятью на основе того, что доступно.

ответ

1

Похоже, вы слишком много звоните в API.

Каждый вызов setPosition, remove и addMarker выполняет IPC. Я бы предложил ограничить это числом ниже 100, если это возможно.

Из кода, который я вижу, вы делаете какую-то кластеризацию, что является хорошим началом.

Я бы также предложил не вызывать удаление для маркеров, которые выходят за пределы экрана (если это не необходимо, например, кластеры меняются, поскольку изменение масштаба) и сохранение идентичности маркеров, поэтому маркеры, которые остаются на экране, не изменяются или не изменяются.

У меня нет проблем с маркерами 20000 при использовании Android Maps Extensions механизма кластеризации, который выполняет то, что я описал.

Update после обновления вопрос:

Другая история в настоящее время. В вашем приложении используется около 25 МБ. Это будет проблематично для Maps API v2, потому что каждый вызов (как я уже говорил) делает IPC, который, в свою очередь, заставляет GC согласно this answer и другим источникам. Большая куча означает, что больше времени потребуется на GC.

Решение? Было бы предпочтительнее, чтобы ваш объем памяти был намного ниже.

+0

спасибо за понимание Maciej. однако я не добавляю/удаляю/обновляю очень большое количество контактов. Это примерно 25 маркеров при каждом вызове callbackCameraChangeListener. Я обновляю свой вопрос с дополнительной информацией –

+0

@ VietNguyen обновленный ответ тоже –

Смежные вопросы