FragmentStatePagerAdapter Speicherleck (verschachtelte Fragmente mit Viewpager)

7

Ich habe ein "Speicherleck" in meinem Adapter (Zitate werden später erklärt). Ich verwende derzeit verschachtelte Fragmente, um einen Viewpager zu hosten.

Mein Setup ist wie folgt:
 1. Aktivität (Leere Aktivität, die Fragment A hostet)
 2. Fragment A - Fragment, das Viewpager mit Fragmentstatepagereadapter hostet. Jede Viewpager-Seite enthält Fragment B.
 3. Fragment B - ein Fragment, das eine Bildansicht enthält.

Alles funktioniert gut, außer wenn eine Konfigurationsänderung auftritt. Wenn der Heap überwacht wird, scheint er bei jeder Rotation um 100 KB zu wachsen. Manuell GCing gibt den Speicher nicht frei.

Dinge, die ich versucht habe:
1. Ersetzen Sie Fragment B durch ein leeres Fragment - das gleiche Problem tritt auf, so dass nicht das Imageview das Problem verursacht.
2. Entfernen Sie beide Fragmente A und B und drehen Sie die Aktivität. Kein Speicherverlust tritt auf, also ist es nicht die Aktivität 3. Verwendete MAT vor jeder Ausrichtung und nach etwa 50 Umdrehungen, um den Heap zu erhalten. MAT zeigt einen Hauptverdächtigen, der meine Adapterklasse ist. Es zeigt 7MB des beibehaltenen Heaps (sehr kleiner flacher Haufen) von Beobachtern wie:

%Vor%

Warum ich einen Viewpager in einem Fragment verwende:
1. Ich möchte den Status des Adapters und anderer Variablen, die sich auf den Viewpager beziehen, am Leben erhalten, indem ich setretainstance (true) festlege.
2. Nach einer Änderung der Konfiguration, ich nicht den Adapter neu erstellen, aber die alte verwenden, um den Viewpager anzuhängen.
3. Wenn ich den alten Adapter nicht wiederverwende, sondern nach einer Konfigurationsänderung einen neuen Adapter erstelle, verschwindet das Speicherleck.
4. Der Speicherverlust verschwindet auch, nachdem ich die Aktivität geschlossen habe und zur vorherigen Aktivität zurückgekehrt bin.

Irgendwelche Ideen? Würde mich über jede Hilfe freuen.

Danke, JC

    
JC. 30.12.2013, 10:33
quelle

1 Antwort

25

Ich hatte ein ähnliches Speicherleck, das jetzt behoben ist.

In meinem entsprechenden Fragment A habe ich den FragmentStatePagerAdapter mit this.getFragmentManager() anstelle von this.getChildFragmentManager() instantiiert, da verschachtelte Fragmente vorhanden sind.

Bitte lassen Sie mich wissen, ob dies auch Ihr Problem behebt.

    
Carlos Castro 07.01.2014 15:24
quelle