10

Quando si utilizza MapView dalla più recente API di google maps, si verifica una perdita di memoria perché MapView trattiene la mia attività.MapView v2 mantenendo il contesto intorno a

Ho usato perdite Canarie e hanno questa traccia


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

D/LeakCanary: * Riferimenti COM .google.android.gms.location.internal.sa

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

D/LeakCanary: * riferimenti com.google.maps .un pi.android.lib6.d.aj.b

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

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

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

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

D/LeakCanary: * perdite com.myapp.activities.main.AttractionDetailAttività in posizione


Qualcuno ha visto questo prima?

+1

Problema noto. Se un numero sufficiente di persone lo reciterà, forse verrà risolto prima del 2018: https://code.google.com/p/gmaps-api-issues/issues/detail?id=8111 –

risposta

20

Verificare se si sta chiamando googleMap.setMyLocationEnabled(true) nel proprio callback onMapReady().

Se si è quindi si dovrebbe chiamare googleMap.setMyLocationEnabled(false) nel tuo onDestroy.

+0

In realtà questo ha funzionato ... Ancora penso è un bug che dovrebbe essere risolto ma grazie! – Marcel

+2

Sto ancora vedendo la perdita si verificano anche quando si applica questa soluzione alternativa. – NasaGeek

+0

@NasaGeek Indovina che è troppo tardi ma puoi confermare se la perdita è uguale a questa o qualcos'altro. L'SDK di Google Maps ha molte perdite, immagino che la maggior parte di esse sia stata corretta nell'ultima versione di Google Play Services – Chaits

7

questo ha funzionato per me:

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

solo per dare un'altra opzione in quanto questa soluzione non ha funzionato per me.

ho trovato questa discussione davvero utile in cui propone alcune soluzioni relative alla perdita di memoria in MapView:

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

Per me, le cose più interessanti da questa discussione (che ha lavorato per me) è:

1) Assicurati di annullare la registrazione tuoi callback:

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

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

     googleApiClient.disconnect(); 
     googleApiClient = null; 
} 

2) Utilizzare un WeakReference per 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); 
    } 

} 

Speranza che aiuta!