【问题标题】:Possible Memory leak while updating current location marker in android在android中更新当前位置标记时可能存在内存泄漏
【发布时间】:2015-11-04 08:31:53
【问题描述】:

我正在开发一个涉及谷歌地图的 android 应用程序,并且我正在更新用户的当前位置。使用内存监视器,我观察到每次调用 LocationListener 的 onLocationChanged() 时都会分配少量内存。这个函数调用 drawMarker() 我更新标记。我对谷歌地图和内存管理相当陌生,我只想知道我的代码中是否存在内存泄漏,或者事情是否如此。当我触摸地图时会分配大量内存,我认为它与内部代码有关,而不是我的,因为触摸地图时我什么都不做。以下是每次更新位置时执行的代码,如果我关闭 GPS,则不会更新位置,因此不会增加内存。

public void onLocationChanged(Location location) {
    // redraw the marker when get location update.
    drawMarker(location);
    location = null;
}

private void drawMarker(Location location){

    mMap.clear();

    LatLng currentPosition = new LatLng(location.getLatitude(),location.getLongitude());

    if(currentLocationMarker == null) {
        mMap.addMarker(new MarkerOptions()
                .position(currentPosition)
                .snippet("Lat:" + location.getLatitude() + "Lng:" + location.getLongitude()));
    }


    CameraUpdate update = CameraUpdateFactory.newLatLngZoom(currentPosition, 15);
    mMap.animateCamera(update);
    update = null;
    currentPosition = null;
    location=null;
}

同一个 LatLng 对象不能重复使用,因此每次都需要创建一个新对象。我猜内存的增加来自每次执行的两个内存分配语句,但我不确定这是否是一个问题。我也没有看到任何垃圾收集发生,除非我明确要求来自 android studio 的垃圾收集。

感谢任何帮助!

【问题讨论】:

    标签: android google-maps memory-leaks


    【解决方案1】:

    如果当你手动触发 GC 时内存被释放,这意味着你并没有真正泄漏任何东西。

    我的一个好建议是将 Leak Canary 集成到您的项目中:

    https://github.com/square/leakcanary

    这是一个非常好的库,可以让您查找应用程序中是否存在任何内存泄漏。 它会自动定期进行内存转储,并使用 MAT(内存分析器工具)的分支进行比较

    【讨论】:

    • 哦!我知道了。那么如果发生内存泄漏,显式 GC 不会释放内存吗?我怎样才能检测到泄漏?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多