12

Google マップに約 80 個のマーカーを描画する際に問題が発生しました。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);
}

このコードを複数回実行すると (1 分に 1 回更新されます)、OutOfMemoryExpcetion が発生します。

大きなマーカー アイコンを使用すると、OutOfMemoryException のスローが速くなるため、メモリの問題は適切にリサイクルされていないアイコン ビットマップに関連していると思います。

また、デバイスの回転を横向きから縦向きに変更すると、使用されるヒープメモリが増加することもわかりました。GC の後、メモリは解放されません。

マーカーを間違って追加しているのか、Map API の実装で問題に直面しているのかを誰かが知っていますか?


Google マップのサンプルアプリでエラーを再現してみました。マーカーデモで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を参照してください。 問題によると、修正する必要がありますが、自分でテストしていません。

4

3 に答える 3