Das über XML erstellte UI-Objekt wird in Android Marshmallow nicht gesweept

8

Ich arbeite daran, Android Marshmallow für einige Hardware zu portieren. Das Problem, dem ich gegenüberstehe, ist, wenn ich ein UI-Objekt über XML erzeuge, wird es nicht von GC gescannt. Zum Beispiel:

Ich habe eine App erstellt, um dies zu überprüfen. Diese App hat 2 Aktivitäten. Jede Aktivität hat eine Schaltfläche. Wenn ich diese Taste drücke, wird die aktuelle Aktivität beendet und andere Aktivitäten gestartet.

Wenn ich eine Schaltfläche im XML-Layout und in der Aktivität setcontentview definiere, wird ein Objekt vom Typ button erstellt. Jetzt schalte ich diese Aktivitäten immer wieder um, um mehrere Objekte der Schaltfläche zu erstellen, da ich LAUNCH_MODE (absichtlich) nicht verwende.

Nun sagen wir, dass 8 Objekte von Button erstellt wurden. Ich drückte mehrmals auf die Taste und kam zum Startbildschirm. Ich habe GC von Android Studio initiiert. Danach, wenn ich Heap Dump nehme, finde ich noch 8 Instanzen von Button, aber "IDs von Objekten werden geändert". Darüber hinaus habe ich gesehen, dass der Konstruktor der Button-Klasse nicht aufgerufen wird, nachdem ich GC gestartet habe.

Wer hat diese Objekte erstellt? Und wenn dies die gleichen Objekte sind, warum wurde IDs geändert.

Dasselbe gilt, wenn ich ein Button-Objekt mit Button Java-Klasse erzeuge,

wie Schaltfläche b = neue Schaltfläche (Kontext c);

Objekte werden gesweept.

Bitte setzen Sie etwas Licht, wenn Sie das Problem verstehen.

BR, Rahul

    
Rahul 09.12.2016, 13:10
quelle

2 Antworten

0

Sie haben keine Code-Beispiele für das, worüber Sie sprechen, bereitgestellt. Ich kann nur vermuten, dass Sie diese Button-Objekte tatsächlich wie erwähnt erstellen,

%Vor%

Wenn Sie auf ein Schaltflächen-Widget in XML verweisen, sollten Sie keine Button-Objekte erstellen. Sie sollten das Objekt nur instanziieren.

Schaltfläche in XML erstellt

%Vor%

Instanzierungsschaltfläche im Code

%Vor%

Dieses Schaltflächenobjekt sollte nicht mehrere ID-Referenzen haben. Wenn Sie diesem Widget eine ID in XML zuweisen, wird die Referenz-ID sofort zu Ihrer R.java-Datei hinzugefügt. Überprüfen Sie Ihre R.java-Datei, Sie sehen etwas wie

%Vor%

Dies ist ein endgültiger Wert, der nicht geändert werden kann. Jedes Mal, wenn Sie auf das Objekt btnAction verweisen, verweisen Sie auf 0x7f0d033b. Wenn Sie Ihre Aktivität zerstören, wird dieses Objekt zerstört, es sei denn, Sie machen etwas Seltsames wie statische Objekte erstellen.

Beachten Sie auch, dass es keine Garantie gibt, dass GC sofort nach der Zerstörung einer Aktivität aufgerufen wird. Es wird meist bei Bedarf aufgerufen. Wenn Sie "Erzwingen", dass GC aufgerufen werden soll, wenn eine Aktivität zerstört wird, bereinigen Sie in onDestroy () der Aktivität. Prost!

%Vor%

Bedenken Sie auch, dass der Aufruf von System.gc () nicht unbedingt bedeutet, dass Garbage Collector aufgerufen wird. Die Definition dafür ist

  

Zeigt der VM an, dass es eine gute Zeit wäre, den Müll zu verarbeiten   Kollektor. Beachten Sie, dass dies nur ein Hinweis ist. Es gibt keine Garantie dafür   Der Garbage Collector wird tatsächlich ausgeführt.

    
portfoliobuilder 20.12.2016 00:35
quelle
0

Keine Notwendigkeit, einen Button neu zu erstellen, der Button ist bereits in manifest definiert, nur mit findViewById, um es zu suchen.

    
denbard 20.12.2016 06:18
quelle