11

从最新的谷歌地图 API 中使用 MapView 时,我遇到了内存泄漏,因为 MapView 正在保留我的活动。

我使用了 Leak Canary 并有这个痕迹


D/LeakCanary﹕* GC ROOT com.google.android.gms.location.internal.ta

D/LeakCanary﹕ * 参考 com.google.android.gms.location.internal.sa

D/LeakCanary﹕ * 参考 com.google.maps.api.android.lib6.dvc

D/LeakCanary﹕ * 参考 com.google.maps.api.android.lib6.d.aj.b

D/LeakCanary﹕ * 参考 com.google.maps.api.android.lib6.gmm6.cpa

D/LeakCanary: * 参考 com.google.maps.api.android.lib6.gmm6.cymParent

D/LeakCanary: * 引用 android.widget.FrameLayout.mParent

D/LeakCanary: * 参考 com.google.android.gms.maps.MapView.mContext

D/LeakCanary﹕*泄漏 com.myapp.activities.main.AttractionDetailActivity 实例


有没有人见过这个?

4

3 回答 3

20

检查您是否正在调用googleMap.setMyLocationEnabled(true)onMapReady() 回调。

如果你是,那么你应该调用googleMap.setMyLocationEnabled(false)你的 onDestroy。

于 2015-08-18T03:04:44.150 回答
9

这对我有用:

@Override
    public void onDestroy() {
        super.onDestroy();
        mMapView.onDestroy();
        if (mMap != null) {
            mMap.setMyLocationEnabled(false);
            mMap.clear();
        }
    }
于 2015-12-04T13:44:26.377 回答
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 使用 Wea​​kReference

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

}

希望能帮助到你!

于 2017-04-19T02:47:21.000 回答