我在 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);
}
多次执行此代码(每分钟刷新一次)后,我得到了 OutOfMemoryExpcetion。
当使用较大的标记图标时,OutOfMemoryException 抛出得更快,所以我认为内存问题与未正确回收的图标位图有关。
我还发现,当将设备的旋转从横向更改为纵向并返回时,会增加使用的堆内存。GC 后内存不会被释放。
有人知道我是否错误地添加了标记,还是我在 Map API 实现中遇到了问题?
我尝试使用 Google Map 示例应用程序重现该错误。在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 根据问题应该修复但我自己没有测试过。