2013-05-26 38 views
3

在Google Maps API v2中管理標記的正確方法是什麼?我試圖用僅在該區域內可見的標記來更新視口,並且我使用OnCameraChangeListener來知道何時使用最新標記更新視口。但是,看起來地圖在繪製或更新標記時不可滾動/可縮放。我注意到,當使用setIcon()時,延遲更加糟糕。在Google Maps v1中,當我使用ItemizedOverlays時,我從未遇到過這個麻煩。在這裏我的代碼時遇到滯後滾動/縮放要點:android谷歌地圖v2標記正在繪製/更新時滯後

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:

我創建了一個示例應用程序與上面的代碼和工作的事情按照計劃(即沒有11:43) 。我花了一些時間思考這個問題,我認爲這與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。

從代碼我看你正在做某種聚類,這是一個好的開始。

我還建議不要爲屏幕外的標記調用remove(除非必要,例如,因爲縮放更改而更改簇)並保留標記的身份,因此留在屏幕上的標記不會重新定位或以其他方式修改。

當使用Android Maps Extensions聚簇引擎時,我用20000個標記沒有問題,這是我所描述的。問題更新後

更新:

一個不同的故事現在。您的應用程序正在使用大約25 MB。對於Maps API v2來說,這會造成問題,因爲每次調用(像我之前所說的)都在進行IPC,而IPC又會根據this answer和其他來源強制執行GC。堆越大意味着GC需要的時間越多。

解決方案?最好將內存佔用降低很多。

+0

感謝洞察Maciej。不過,我並沒有真正添加/刪除/更新大量的引腳。在任何給定的onCameraChangeListener回調函數中大約有25個標記。我用更多的信息更新我的問題 –

+0

@VietNguyen更新了答案 –