2015-08-12 13 views
10

Podczas korzystania z MapView z najnowszego interfejsu API map Google, dostaję wycieku pamięci, ponieważ MapView trzyma się mojej działalności.MapView v2 zachowuje kontekst wokół

kiedyś szczelności Canary i mają ten ślad


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

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

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

D/LeakCanary: * referencje com.google.maps .za pi.android.lib6.d.aj.b

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

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

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

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

D/LeakCanary: * wycieki com.myapp.activities.main.AtrakcjaDziałalność informacyjna w stanowisko


Czy ktoś to widział wcześniej?

+1

Znany problem. Jeśli wystarczająca liczba osób go dopisze, może zostanie naprawiona przed 2018: https://code.google.com/p/gmaps-api-issues/issues/detail?id=8111 –

Odpowiedz

20

Sprawdź, czy dzwonisz pod numer googleMap.setMyLocationEnabled(true) w wywołaniu zwrotnym onMapReady().

Jeśli jesteś wtedy powinieneś zadzwonić pod numer googleMap.setMyLocationEnabled(false) w swoim onestrze.

+0

Właściwie to działało ... Wciąż myślę to błąd, który należy naprawić, ale dziękuję! – Marcel

+2

Ciągle zauważam, że wyciek występuje nawet podczas stosowania tego obejścia. – NasaGeek

+0

@NasaGeek Zgadnij, że jest za późno, ale możesz potwierdzić, czy wyciek jest taki sam jak ten lub coś innego. Google Maps SDK ma wiele nieszczelności, myślę, że większość z nich została naprawiona w najnowszej wersji usług Google Play – Chaits

7

Ten pracował dla mnie:

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

Wystarczy dać innej opcji jak to rozwiązanie nie działa dla mnie.

znalazłem to naprawdę przydatnych wątek gdzie zaproponować pewne obejścia związane z wyciekiem pamięci w MapView:

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

Dla mnie najciekawsze rzeczy z tego wątku (który pracował dla mnie) jest:

1) Upewnij się, aby wyrejestrować swoje wywołania zwrotne:

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

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

     googleApiClient.disconnect(); 
     googleApiClient = null; 
} 

2) Użyj WeakReference dla LocationListener

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

} 

Nadzieję, że to pomaga!

Powiązane problemy