2015-08-12 18 views
10

Wenn ich die MapView von der neuesten Google Maps API verwende, bekomme ich ein Speicherleck, weil MapView meine Aktivität festhält.MapView v2 behält Kontext um

I Leck Canary verwendet und diese Spur haben


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

D/LeakCanary: * Referenzen com .google.android.gms.location.internal.sa

D/LeakCanary: * Referenzen com.google.maps.api.android.lib6.dvc

D/LeakCanary: * Referenzen com.google.maps .ein pi.android.lib6.d.aj.b

D/LeakCanary: * Referenzen com.google.maps.api.android.lib6.gmm6.cpa

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

D/LeakCanary: * Referenzen android.widget.FrameLayout.mParent

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

D/LeakCanary: * leckt com.myapp.activities.main.AttractionDetailActivity in Haltung


Hat jemand dieses vorher gesehen?

+1

Bekanntes Problem. Wenn es genug Leute gibt, wird es vielleicht vor 2018 repariert werden: https://code.google.com/p/gmaps-api-issues/issues/detail?id=8111 –

Antwort

20

Überprüfen Sie, ob Sie in Ihrem onMapReady() - Callback googleMap.setMyLocationEnabled(true) aufrufen.

Wenn Sie dann sind, sollten Sie googleMap.setMyLocationEnabled(false) in Ihrem onDestroy aufrufen.

+0

Wirklich das hat funktioniert ... Ich denke immer noch ist ein Fehler, der behoben werden sollte, aber danke! – Marcel

+2

Ich sehe immer noch das Leck auftreten, auch wenn Sie diese Problemumgehung anwenden. – NasaGeek

+0

@NasaGeek Schätze, das ist zu spät, aber kann bestätigen, ob das Leck das gleiche oder etwas anderes ist. Google Maps SDK hat viele Lücken, ich denke, die meisten von ihnen wurden in der neuesten Version von Google Play Services behoben – Chaits

7

Das ist für mich gearbeitet:

@Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mMapView.onDestroy(); 
     if (mMap != null) { 
      mMap.setMyLocationEnabled(false); 
      mMap.clear(); 
     } 
    } 
0

einfach eine andere Option zu geben, wie diese Lösung nicht für mich arbeiten.

ich diese wirklich nützlich Thread gefunden, wo es einige Abhilfen vorschlagen, um den Speicherverlust in MapView bezogen werden:

https://github.com/googlesamples/android-play-location/issues/26

Für mich sind die interessantesten Dinge aus diesem Thread (das für mich gearbeitet) ist:

1) Stellen Sie sicher, dass Ihre Rückrufe abzumelden:

if (googleApiClient != null) { 
     googleApiClient.unregisterConnectionCallbacks(this); 
     googleApiClient.unregisterConnectionFailedListener(this); 

     if (googleApiClient.isConnected()) { 
       LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this); 
     } 

     googleApiClient.disconnect(); 
     googleApiClient = null; 
} 

2) Verwenden Sie einen WeakReference für Location

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

} 

Hoffe, es hilft!