当使用最新谷歌地图API中的MapView时,我收到内存泄漏,因为MapView正在保留我的活动。
我使用了泄漏金丝雀并且有这个痕迹
D / LeakCanary:* GC ROOT com.google.android.gms.location.internal.t.a
D / LeakCanary:*引用com.google.android.gms.location.internal.s.a
D / LeakCanary:*引用com.google.maps.api.android.lib6.d.v.c
D / LeakCanary:*引用com.google.maps.api.android.lib6.d.aj.b
D / LeakCanary:*引用com.google.maps.api.android.lib6.gmm6.c.p.a
D / LeakCanary:*引用com.google.maps.api.android.lib6.gmm6.c.y.mParent
D / LeakCanary:*引用android.widget.FrameLayout.mParent
D / LeakCanary:*引用com.google.android.gms.maps.MapView.mContext
D / LeakCanary:*泄漏com.myapp.activities.main.AttractionDetailActivity instance
有没有人见过这个?
答案 0 :(得分:20)
检查你是否在onMapReady()回调中调用googleMap.setMyLocationEnabled(true)
。
如果您那时应该在onDestroy中调用googleMap.setMyLocationEnabled(false)
。
答案 1 :(得分:9)
这对我有用:
@Override
public void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
if (mMap != null) {
mMap.setMyLocationEnabled(false);
mMap.clear();
}
}
答案 2 :(得分:1)
只是提供另一种选择,因为这个解决方案对我不起作用。
我发现这个非常有用的线程,它提出了一些与MapView内存泄漏相关的变通方法:
https://github.com/googlesamples/android-play-location/issues/26
对我来说,这个帖子中最有趣的东西(对我有用)是:
1)确保取消注册您的回调:
if (googleApiClient != null) {
googleApiClient.unregisterConnectionCallbacks(this);
googleApiClient.unregisterConnectionFailedListener(this);
if (googleApiClient.isConnected()) {
LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this);
}
googleApiClient.disconnect();
googleApiClient = null;
}
2)对LocationListener使用WeakReference
public class WeakLocationListener implements LocationListener {
private final WeakReference<LocationListener> locationListenerRef;
public WeakLocationListener(@NonNull LocationListener locationListener) {
locationListenerRef = new WeakReference<>(locationListener);
}
@Override
public void onLocationChanged(android.location.Location location) {
if (locationListenerRef.get() == null) {
return;
}
locationListenerRef.get().onLocationChanged(location);
}
}
希望它有所帮助!