MapView v2保持上下文

时间:2015-08-12 19:04:26

标签: android google-maps memory-leaks android-mapview leakcanary

当使用最新谷歌地图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

有没有人见过这个?

3 个答案:

答案 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);
    }

}

希望它有所帮助!