Ich habe eine activity
, die eine Basis erweitert class
genannt LocationAwareActivity
all dies LocationAwareActivity
activity
erstellt einen Location Service Client
LocationServices.getFusedLocationProviderClient
und listens
zu
Standortaktualisierungen.
Quelle für diese Aktivität ist hier Ссылка
Und wenn die Aktivität zerstört wird, ruft sie removeLocationUpdates
auf. Was ich finde, ist
removeLocationUpdate
gibt eine Aufgabe zurück, die immer nicht erfolgreich zurückgibt activity
nicht zu Garbage Collection wird.
- Wenn ich also irgendeine Aktivität starte, die von LocationAwareActivity
erbt, bleibt diese Aktivität immer auf dem Heap.
Es stellt sich also die Frage, wie man den Empfang von Standortaktualisierungen nicht mehr richtig durchführen kann, damit activity
als Garbage Collection erfasst werden kann.
Die gesamte Quelle für dieses Projekt kann hier abgerufen werden - Ссылка
Der Grund, warum das Task-Objekt false zurückgibt, ist in Ihrer stopLocationUpdates
-Methode. Sie erstellen erneut eine lokale **LocationCallback**
-Referenz und verwenden diese Referenz dann als Argument in locationProviderClient.removeLocationUpdates(cL);
.
wo Ihr lokaler LocationCallBack nie im locationProviderClient vorhanden ist
Sie müssen also anstatt ein anderes LocationCallBack-Objekt zu erstellen, dasselbe globale Objekt übergeben, das Sie in Ihrer startLocationUpdates
-Methode instanziieren
sollte dein Code so sein
%Vor%In removeLocationUpdates sollten Sie locationCallback übergeben, die aktuelle Implementierung ist falsch.
Dennoch besteht die Möglichkeit, dass Speicher irgendwo anders ausgelaufen ist. Sie sollten versuchen, Leakcanary in Ihre App zu integrieren, und es kann Ihnen einen Referenzbaum geben und Ihnen sagen, welches Feld oder welcher Listener diesen Speicherverlust verursacht . Sie können einen meiner einzigen Blogpost hier
nennen %Vor%Beim Betrachten des Codes im Repository habe ich einige Probleme in Ihrem Design entdeckt, die dazu führen könnten, dass% code% verloren geht.
1) Sie verwenden zwei verschiedene Activity
. Eine im Start und eine in der Stop-Methode, aber Sie sollten eigentlich das gleiche verwenden. Ein einmaliges Instanziieren wäre also ausreichend und würde wahrscheinlich auch zu einem erfolgreichen Ergebnis von LocationCallbacks
führen, wenn Task
entfernt wird.
2) Da Sie LocationCallback
zweimal mit LocationCallback
instanziiert haben, behalten Sie eine nicht statische Referenz einer inneren Klasse bei, selbst wenn Sie die umschließende Klasse beenden, was Ihre Anonymous Class
verursacht. Sie können mehr darüber lesen hier .
3) IMHO ist es besser, eine separate Manager-Klasse für die Verarbeitung Ihrer Standortanforderungen zu verwenden, als eine Memory Leak
zu abstrahieren.
Das sagte hier ist mein ...
GpsManager.java
%Vor% und rufe dies von deinem Activity
wie folgt auf
YourActivity.java
%Vor%Dies ist nur eine Vermutung, weil ich Ihren Code nicht versucht habe, aber die Lösung sollte Ihnen trotzdem helfen. Bitte korrigieren Sie mich, wenn ich falsch liege;)
Hi @Subodh Nijsure Bitte prüfen Sie den folgenden Code und fügen Sie ihn in Ihren Code ein und nachdem Sie ihn überprüft haben:
%Vor%Ich denke voidTask.isSuccessful () Diese Methode funktioniert nicht, wenn Sie diesen Listener zu diesem Zeitpunkt verwenden, funktioniert es gut und ich sehe auch im Speicher ist es Freigabe aller Speicher, wenn Sie zu vorherigen Aktivität kommen.
Und wenn Sie zu einer Aktivität umleiten, dann bitte stopLocationUpdates () einmal in onPause () aufgerufen und von einer anderen Methode wie onDestroy (), onStop () entfernen, weil es einmal aufhört, also warum sollten wir Anruf mehrere Zeit.
Hoffe das hilft dir.
Tags und Links java android android-location