我正在开发一个涉及谷歌地图的Android应用程序,我正在更新用户的当前位置。使用内存监视器,我观察到每次onLocationChanged()调用LocationListener时都会分配少量内存。此函数调用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。
感谢任何帮助!
答案 0 :(得分:0)
如果手动触发GC时内存被释放,则意味着您没有真正泄漏任何内容。
我的一个好建议是将Leak Canary整合到您的项目中:
https://github.com/square/leakcanary
这是一个非常好的库,允许您查找应用程序中是否存在任何内存泄漏。 它需要自动定期内存转储并使用MAT(Memory Analyzer Tool)分析它们