4

Google Maps API v2 でマーカーを管理する適切な方法は何ですか? その領域内に表示されるマーカーのみでビューポートを更新しようとしていますOnCameraChangeListener。最新のマーカーでビューポートをいつ更新するかを知るために使用しています。ただし、マーカーを描画または更新しているときはいつでも、マップはスクロール/ズーム可能ではないようです。setIcon()を使用すると、ラグがさらに悪化することに気付きました。Google マップ v1 では、ItemizedOverlays を使用したときにこの問題は発生しませんでした。スクロール/ズームで遅延が発生している私のコードの要点は次のとおりです。

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

アップデート:

上記のコードを使用してサンプルアプリを作成しましたが、計画どおりに動作します (つまり、遅延はありません)。これについてしばらく考えてみましたが、これは Google マップ v2 に必要なメモリと関係があると思います。logcatを見ると、マップを移動するたびに(マップの更新がトリガーされます)、Nexus 4でこのような多くのgcメッセージが表示されます

05-27 14:28:23.701: D/dalvikvm(2849): GC_FOR_ALLOC freed 1198K, 23% free 26889K/34504K, paused 112ms, total 112ms

これは API 内での潜在的なメモリ リークですか? 私の既存のアプリはすでにいくらかのメモリを消費していますが、GMaps は利用可能なメモリに基づいて独自のメモリを適切に管理できると考えています。

4

1 に答える 1