2

Ich habe einen Code mit Android Strict Mode eingeschaltet, VmPolicy DetectAll und Penalty Death. Dies ist in der Anwendung aktiviert.EditText verursachte Aktivität zu lecken. Keine aktuelle Stackoverflow-Antwort half

So hilft es mir, Speicherleck zu erkennen. Mein Code ist sehr einfach, 2 Aktivitäten (fast leer). Die MainActivity verfügt über einen Button, um SubActivity zu öffnen. Die SubActivity hat nur einen EditText.

Der Code hier erhalten https://github.com/elye/issue_edittextleak

werden könnte, wenn Sie den Code ausführen, von MainActivity gehen Teilaktivität, und zurück zum MainActivity (Zurück-Taste verwenden), und gehen Teilaktivität, und zurück ... Es wird Absturz mit

E/StrictMode: class com.elyeproj.edittextleak.SubActivity; instances=2; limit=1 
android.os.StrictMode$InstanceCountViolation: class com.elyeproj.edittextleak.SubActivity; instances=2; limit=1 
at android.os.StrictMode.setClassInstanceLimit(StrictMode.java:1) 

Dies ist, weil es erkannt hat SubActivity hat durchgesickert.

Warum SubActivity durchgelaufen ist, weil es EditText hat. Wenn Sie es entfernen, wird es nicht mehr lecken.

Das passiert bei Samsung S5 Lollipop 5.0 (v21). Es leckt auch KitKat (v19). Es passiert nicht auf Samsung S7 Marshmallow und Nexus 6 (Nougat).

Es passiert nicht auf emulierten Nexus 5 Lollipop 5.0.2 (v21). Aber passiert auf V19 emulierten Nexus 5.

Ich habe auf viele Stackoverflow überprüfen, und kann nicht die Lösung finden. Sie werden von mehr Details dieses Problems und meiner Erkundung in https://medium.com/@elye.project/hell-level-4-unleashed-by-android-strict-mode-dare-you-challenge-it-1dc9048bb4fb#.aiffbdikn

lesen Also, was ich will? Ich denke, der Speicherverlust wurde auf Lollipop 5.0.2 und darüber hinaus behoben. Aber für die Version davor, wie könnte ich das Leck verhindern, während ich den editText haben könnte?

+0

Sie müssen den Fokus Ihres Edittext löschen, bevor neue Aktivitäten gestartet werden, EditText.clearfocus(); –

Antwort

0

Verwenden Sie diesen Code, um SubActivity zu beenden.

Fügen Sie diesen Code in die SubActivity Class-Datei ein.

@Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
     finish(); 
    } 
+0

Versuchte es, und es stürzt immer noch ab. Haben Sie Ihre Antwort mit dem bereitgestellten Code versucht und sehen, ob Ihre Antwort den Absturz löst? – Elye

+0

Ja, ich werde es versuchen, nachdem ich diesen Code hier –

3

Ich denke, das Problem nichts mit dem Bearbeiten von Text zu tun hat, wie aus der Strict-Modus log SubActivity; instances=2; limit=1 klar ist, dass Sie zwei Instanzen von Teilaktivität haben. Dies geschieht, da bei jedem Start von subActivity eine neue Instanz davon erstellt wird. Dieses Problem kann durch die Verwendung der Startmodusflags singleInstance oder singleTask beim Start von subActivity gelöst werden. Dies garantiert, dass nur eine Instanz der Aktivität existieren kann.

EDIT 1:

Ich spielte mit Ihrem Code, und festgestellt, dass das Problem auf v19 von emulierten Nexus 5.em reproduzierbar ist, ich bin klar, dass dieses Problem hat nichts mit dem Bearbeiten von Text, wie das Thema zu tun ist reproduzierbar, selbst wenn der SubActivity keine Ansichten zugeordnet sind. Wie in dieser Stack Oveflow Post beantwortet, dies ein Fehler in Strict-Modus sein kann, wie die Verbindung darauf hinweist

Wenn eine Aktion gestartet wird, und verließ und sehr schnell neu gestartet, Sie können eine StrictMode.InstanceCountViolation bekommen.

Dies ist jedoch einfach, weil der Garbage Collector noch nicht die erste Instanz der Aktivität abgeschlossen hat, was bedeutet, dass vorübergehend 2 (oder mehr) Instanzen im Speicher sind.

Aufruf System.gc() vor startActivity() oder startActivityForResult() wird die StrictMode.InstanceCountViolation

Und aus dem Android DOcs

stoppen

Sie nicht gezwungen fühlen, alles zu reparieren das StrictMode findet. Insbesondere sind viele Fälle von Plattenzugriff während des normalen Aktivitätslebenszyklus oft notwendig. Verwenden Sie StrictMode, um Dinge zu finden, die Sie zufällig gemacht haben. Netzwerkanforderungen im UI-Thread sind jedoch fast immer ein Problem.

+0

eingegeben habe Versucht es, und es stürzt immer noch ab. Haben Sie Ihre Antwort mit dem bereitgestellten Code versucht und sehen, ob Ihre Antwort den Absturz löst? – Elye

+0

Ya, für Kitkat, auch ohne den EditText, das Problem bestehen. Aber für Lollipop 5.0 tritt das Problem nur auf, wenn der EditText dort ist. Daher haben sie höchstwahrscheinlich etwas in KitKat behoben, aber noch nicht alle. – Elye