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を参照してください。 問題によると、修正する必要がありますが、自分でテストしていません。