2017-02-17 2 views
0

Ich habe ein Fragment, das den Location Manager (android.location.LocationManager) verwendet. mLocationManager und mLocationListener (android.location.LocationListener) sind private Variablen, die fragmentiert werden sollen.LocationListener leckt in Fragmenten, selbst wenn sie entsprechend behandelt werden

in onResume()

mLocationListener = new ABCLocationListener(); 
mLocationManager = (LocationManager) getActivity().getSystemService(
        Context.LOCATION_SERVICE); 
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10 * 1000L, 0F, mLocationListener); 

in onPause()

mLocationManager.removeUpdates(mLocationListener); 
mLocationListener = null; 

Ich erhalte Lecks für ABCLocationListener.

logcat D/LeakCanary: | mlistener = [email protected]87568 (0x33733270)

Was habe ich überprüft?
1) Der Hash-Wert für das erstellte ABCLocationListener-Objekt unterscheidet sich von 0x33733270.
2) Sowohl onResume als auch onPause-Methode werden nur einmal aufgerufen. Der Hash-Wert des Zuhörers in diesen beiden Methoden vor removeUpdates und requestLocationUpdates Aufruf ist die gleiche

+0

Welche Art von Eltern dieses Fragments - Ist es ViewPager oder Tabs? Vermeiden Sie auch, jedes Mal ein neues Objekt von onResume() zu erstellen. Einfach einmal erstellen und registrieren und abmelden. –

Antwort

0

prüfen this example, aber ich würde sagen, entweder das onResume fragment wieder genannt wird, oder die mLocationListener Sie instanziiert in onResume ist anders als die Instanz, die Sie deregistrieren in . Es könnte hilfreich sein, wenn Sie den Quellcode des gesamten Fragments bereitstellen. Um sicherzustellen, dass die Standort-Listener-Instanz identisch ist, müssen Sie das Fragment selbst zum Listener machen (indem Sie LocationListener implementieren) und das Fragment registrieren/aufheben (unter Verwendung von this).

+0

Ich habe Protokolle. Ich drucke jedes Mal onResume wird aufgerufen. Ich sehe onResume und onPause einmal aufgerufen werden. Bin auch, den Listener in beiden Methoden vor dem Aufrufen von removeUpdates und requestLocationUpdates – Amb

+0

zuStringing Sie haben das Problem bereits selbst identifiziert. Der Hörer, den Sie abmelden, unterscheidet sich von dem Hörer, den Sie registrieren. Um Ihnen zu sagen, warum ich den Code sehen müsste, aber um ihn zu lösen, machen Sie das Fragment selbst zum Zuhörer, wie ich bereits erwähnt habe. –

+0

Ich meinte, ich habe "toString()" ed die Listener in OnPause und onResume. Der Listener ist in beiden Methoden identisch. Außerdem protokolliere ich, wo auch immer der Listener erstellt wird. Ich sehe, dass der Listener nur einmal erstellt wird. – Amb

Verwandte Themen