Android - Ansicht.Oberfläche OutOfResourcesException
Meine Android-app scheint nicht die Freigabe seiner Ansichten, wenn ich mich bewegen Innenseite ist es mit ListView-navigation und mit der standard-Menü-Taste. Nach hundert oder so verschiedene (10 oder so einzigartigen Aussicht) Lasten, beginnt es zu hinken und schwarz-screening.
Fehler melden:
07-01 09:54:42.913: INFO/ActivityManager(1279): Starting: Intent { cmp=com.site.android.conferencecompanion/.Search } from pid 31290
07-01 09:54:43.013: ERROR/msm7x30.gralloc(1279): /dev/pmem: no more pmem available
07-01 09:54:43.013: ERROR/msm7x30.gralloc(1279): couldn't open pmem (No such file or directory)
07-01 09:54:43.013: ERROR/msm7x30.gralloc(1279): gralloc failed err=Out of memory
07-01 09:54:43.013: WARN/GraphicBufferAllocator(1279): alloc(480, 800, 1, 00000133, ...) failed -12 (Out of memory)
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): Allocated buffers:
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): 0x290740: 1500.00 KiB | 480 ( 480) x 800 | 1 | 0x00000133
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): 0x307448: 60.00 KiB | 102 ( 128) x 120 | 1 | 0x00000133
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): 0x32e4c0: 71.25 KiB | 480 ( 480) x 38 | 1 | 0x00000133
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): 0x3caad8: 60.00 KiB | 102 ( 128) x 120 | 1 | 0x00000133
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): 0x4a47f8: 1346.25 KiB | 480 ( 480) x 718 | 1 | 0x00000133
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): 0x4f9710: 1500.00 KiB | 480 ( 480) x 800 | 1 | 0x00000133
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): 0x54c500: 1500.00 KiB | 480 ( 480) x 800 | 1 | 0x00000133
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): 0x5d1c00: 1500.00 KiB | 480 ( 480) x 800 | 1 | 0x00000133
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): 0x5f5f98: 1500.00 KiB | 480 ( 480) x 800 | 1 | 0x00000133
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): 0x604600: 60.00 KiB | 126 ( 128) x 120 | 1 | 0x00000133
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): 0x60a3d0: 750.00 KiB | 480 ( 480) x 800 | 4 | 0x00000133
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): 0x661270: 1428.75 KiB | 480 ( 480) x 762 | 1 | 0x00000133
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): 0x6830b8: 750.00 KiB | 480 ( 480) x 800 | 4 | 0x00000133
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): 0x70e0e8: 1500.00 KiB | 480 ( 480) x 800 | 1 | 0x00000133
07-01 09:54:43.013: DEBUG/GraphicBufferAllocator(1279): 0x71f238: 71.25 KiB | 480 ( 480)
07-01 09:54:43.013: ERROR/SurfaceFlinger(1279): Layer::requestBuffer(this=0x189d50), index=0, w=480, h=800 failed (Out of memory)
07-01 09:54:43.013: ERROR/Surface(31290): Surface (identity=4545) requestBuffer(0, 0, 0, 0, 00000033) returned a buffer with a null handle
07-01 09:54:43.013: ERROR/Surface(31290): getBufferLocked(0, 0, 0, 0, 00000033) failed (Out of memory)
07-01 09:54:43.013: ERROR/Surface(31290): dequeueBuffer failed (Out of memory)
07-01 09:54:43.013: ERROR/ViewRoot(31290): OutOfResourcesException locking surface
07-01 09:54:43.013: ERROR/ViewRoot(31290): android.view.Surface$OutOfResourcesException
07-01 09:54:43.013: ERROR/ViewRoot(31290): at android.view.Surface.lockCanvasNative(Native Method)
07-01 09:54:43.013: ERROR/ViewRoot(31290): at android.view.Surface.lockCanvas(Surface.java:314)
07-01 09:54:43.013: ERROR/ViewRoot(31290): at android.view.ViewRoot.draw(ViewRoot.java:1457)
07-01 09:54:43.013: ERROR/ViewRoot(31290): at android.view.ViewRoot.performTraversals(ViewRoot.java:1259)
07-01 09:54:43.013: ERROR/ViewRoot(31290): at android.view.ViewRoot.handleMessage(ViewRoot.java:1860)
07-01 09:54:43.013: ERROR/ViewRoot(31290): at android.os.Handler.dispatchMessage(Handler.java:99)
07-01 09:54:43.013: ERROR/ViewRoot(31290): at android.os.Looper.loop(Looper.java:123)
07-01 09:54:43.013: ERROR/ViewRoot(31290): at android.app.ActivityThread.main(ActivityThread.java:3839)
07-01 09:54:43.013: ERROR/ViewRoot(31290): at java.lang.reflect.Method.invokeNative(Native Method)
07-01 09:54:43.013: ERROR/ViewRoot(31290): at java.lang.reflect.Method.invoke(Method.java:507)
07-01 09:54:43.013: ERROR/ViewRoot(31290): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
07-01 09:54:43.013: ERROR/ViewRoot(31290): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
07-01 09:54:43.013: ERROR/ViewRoot(31290): at dalvik.system.NativeStart.main(Native Method)
07-01 09:54:43.203: INFO/ActivityManager(1279): Displayed com.site.android.conferencecompanion/.Search: +292ms
adb shell dumpsys window
zeigt Folgendes:
#1 - #29, junk
#30: AppWindowToken{40bbc000 token=HistoryRecord{408cc260 com.site.android.conferencecompanion/.ProgramDates}}
...
#142: AppWindowToken{40ba65a8 token=HistoryRecord{40b93808 com.site.android.conferencecompanion/.ProgramSpeakers}}
So, wenn ich das richtig verstehe, so etwas wie 112 Ansichten werden im Speicher gehalten. Gibt es etwas, was kann ich dagegen tun? Gibt es einen Scheck oder eine Flagge oder ein parameter fehlt mir? Bin ich misinterpretting der dump?
Dank!
- Haben Sie eine statische Referenz auf einen Kontext oder eine View (die implizit hält einen Zusammenhang)?
- Ich glaube nicht, dass so, wie kann ich sicher sein?
- Verwenden Sie einfach das Schlüsselwort static ist ein guter Ort, um zu starten. Hier einige rudimentäre Dokumentation auf Lecks in Android: developer.android.com/resources/articles/...
- Können Sie bitte klarstellen, was Sie tun im code? Dies geschieht innerhalb einer Aktivität? Oder sind Sie mit der Einführung mehrerer Aktivitäten durch intents aufrufen, wenn der Benutzer wählt ein ListView-Element? Ein code-Beispiel, wie Sie starten/laden einer neuen Sicht gut sein könnte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine große Weise zu überprüfen, um zu sehen, wo die Lecks sind, kommt, ist , wenn Sie in Eclipse Window->Öffnen Perspecive -> DDMS wählen Sie dann den Laufenden Prozess, aus dem Prozess der Auswahl und Verwendung der Zuweisung tracker.Starten Sie die app aber NICHT berühren Sie die app, bevor Sie beginnen, die Zuteilung tracker. Dann tun Sie, was Sie denken, wird das problem verursachen und dann überprüfen Sie die Zuordnungen zu jeder Zeit. Dies sollte zeigen Ihnen genau, was code ist, verursacht ein Leck.
Auch wenn Sie veröffentlichen Sie code wir können einen Blick auf Sie.
(Obwohl das war vor einem Jahr, ich kam hier über Google)
Etwas sagt mir, Sie haben zu viele Ansichten geladen und auf einmal kann Android nicht verfolgen Sie alle. * Das Klang wie nicht mit der ListView richtig, das ist etwas, was viele von uns sind schuldig. Angenommen, Sie haben einen benutzerdefinierten array-adapter:
Wenn Sie überlast diese Funktion, überprüfen Sie immer die convertView.
Android hat einen "Papierkorb" - Mechanismus für die listview-Ansichten, und die Wiederverwendung von Ansichten, wenn möglich. In anderen Worten, anstelle der Schaffung einer Reihe von verschiedenen Ansichten, es werde schnappen Sie sich eine alte Ansicht aus dem Papierkorb.
In Ihrem Fall haben Sie 10 verschiedene Arten von Ansichten. Wenn Sie sehr ähnlich sind, können Sie eine superview und aktivieren oder deaktivieren Sie Teile die Ansicht (zum Beispiel Untersicht.setVisibility(View.GEGANGEN)). Just watch out für die riesige if-Anweisung blockiert. Ich habe nicht verwendet diese vor, aber Sie sollten untersuchen,
Besser wäre, weil Sie nicht haben, um mit viel extra-fluff, und es sollte automatisch verwaltet Android
Versuchen, die Ausweitung Ihrer Aktivitäten, so dass Sie sehen können, wenn Sie garbage Collector (finalize() aufgerufen wird). Ebenso versuchen Sie, und erweitern Sie Ihren Blick, um zu helfen zu identifizieren, wenn Sie Müll gesammelt.
Wenn Sie setzen Ansichten und Aktivitäten in Sammlungen für caching, versuchen Sie es mit collection-Objekte sind, WeakReference, wie WeakHashMap. Sind Sie mit inneren Klassen in Ihren Ansichten oder Aktivitäten? Wenn ja, sind diese Klassen enthält einen Verweis auf die Aktivität oder die Sicht und verhindern, dass Müll gesammelt. Ein gutes Beispiel ist ein AsyncTask ist eine innere Klasse. Diese Aufgabe läuft in seinem eigenen thread, und kann weiterhin zu halten, um Ansichten, auch wenn Sie geschlossen haben, um die Aktivität,
Betrachten Sie auch statische Variablen, sind Sie auf halten, um Objekte?
Dies ist ein problem vom Surface Flinger, Die pflegen und gestalten Oberflächen Anwendung in display-Gerät.
versuchen Sie Folgendes : reduzieren Sie Ihre layout-pixel-format in der xml-Datei .
Wenn ich können lassen Sie eine Anmerkung hier:
Hatte ich das gleiche logs, während ich Tests wurden auf meine Prestigo PMP5080B.
Meine app würde auch random-block.
Habe ich bemerkt, dass wenn ich das USB-Kabel trennen (es ist genug, um Schalter deaktiviert die Verbindung vom tablet, indem Sie in den Einstellungen) die app funktioniert OK.
Ich habe auch bemerkt, dass ich zwar verbunden bin, um meine app mit Eclipse und über USB die SD-Karte kann nicht gemountet werden, aber weiß nicht, ob dieses problem verbunden ist irgendwie zu meinem app, da ich nicht speichern auf SD.
hth
Ich hatte das gleiche problem und schließlich gelöst.
Die Lösung:
Starten Sie Ihre app aus Eclipse und spielen ein wenig mit ihm, während Sie ständig die Einhaltung der LogCat-Konsole in Eclipse. Beim starten einer neuen Aktivität oder so etwas wie, dass Sie sollten sehen:
Die wichtige Sache hier ist die
mViews[x]-part
. x sagt Ihnen, wie viele Aufrufe sind aktiv.Nun, wenn Sie beginnen, eine Tätigkeit, sondern die mViews-Zähler zeigt Ihnen an, dass es 5-10 neue Ansichten, dann können Sie sicher sein, dass Sie versehentlich zu viele Ansichten.
So finden Sie den schwachen Punkt in Ihrem code.
Geschah dies in meine Spiele-app: jedesmal, wenn ich verloren das Spiel 5 oder mehr neue GameOverActivities gestartet wurden, weil der code, die begann eine neue GameOverActivity war in einer Schleife. So nach ein paar Minuten spielen gab es 20 unbenutzte GameOverViews frisst meine Ressourcen.
(Vorsicht also beim Start von Aktivitäten in Schleifen.)
In meinem Fall, der Fehler auftauchte, denn ich war mit Klasse Window change my status bar Farbe, die nur unterstützt android-build-Versionen, die neuer sind als 21. fügen Sie den folgenden code und es funktioniert vielleicht