地图上的75个标记 - >内存泄漏 - > OutOfMemoryException

use*_*372 12 maps android out-of-memory google-maps-android-api-2

我在谷歌地图上绘制大约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);
}
Run Code Online (Sandbox Code Playgroud)

多次执行此代码后(每分钟刷新一次),我得到一个OutOfMemoryExpcetion.

当使用较大的标记图标时,OutOfMemoryException会更快地抛出,因此我认为内存问题与图标位图有关,而该位图未正确回收.

我还想到,当将设备的旋转从横向更改为portait并返回时,会增加使用的堆内存.在GC之后,内存不会被释放.

有人知道我是否错误地添加了标记,或者我是否在Map API实现中遇到问题?


我尝试使用Google Map示例应用程序重现错误.在android-sdk/extras/google/google_play_services/samples/maps/src/com/example/mapdemo/MarkerDemoActivity.java标记演示中可以找到.加快测试速度我增加了创建的标记数量.

int numMarkersInRainbow = 12;
Run Code Online (Sandbox Code Playgroud)

改成

int numMarkersInRainbow = 100;
Run Code Online (Sandbox Code Playgroud)

现在启动演示应用程序,选择标记演示并将设备的旋转从纵向切换到横向并返回几次.

初始堆:

Heap size   Allocated  Free      %Used    #Objects
11,543 BM   9,898 MB   1,645 MB  85,75%   65.982
Run Code Online (Sandbox Code Playgroud)

在几个方向更改后堆积:

Heap size   Allocated  Free      %Used    #Objects
15,652 MB   11,337 MB  4,316 MB  72,43%   76.984
Run Code Online (Sandbox Code Playgroud)

在更多方向更改后堆积:

Heap size   Allocated  Free      %Used    #Objects
21,312 MB   16,411 MB  4,901 MB  77,00%   111.350
Run Code Online (Sandbox Code Playgroud)

最终结果将是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 根据问题应该修复但我没有自己测试过.

小智 0

您可以采用以下一种方法来解决可能的 API 问题...检测设备旋转并通过将 MarketOptions 对象设置为 null 来删除该对象...然后用标记重新填充它。