Android-out-of-memory-Prävention
Habe ich eine Liste, die zeigt, dass thumbnails (kleine Bilder) heruntergeladen werden on-the-fly aus dem web.
An einem gewissen Punkt, der Prozess läuft out of memory.
Wie kann ich feststellen, dass der freie Speicher ist über den Weg zu laufen, also kann ich auch aufhören herunterladen mehr Bilder?
Ich würde gerne wissen es im Voraus, um nicht auf den Rand der out-of-memory.
Hinweis:
Ist es nicht ein Speicher-Leck, einfach nur eine Menge der heruntergeladenen bitmaps.
Dank.
Ich werde etwas näher. Um nicht download jedes Bild einige Male, bis ich den cache der heruntergeladenen Bilder in der Aktivität und ersetzen die alten Bilder - LRU. Ich würde gerne wissen, Wann man aufhören caching oder gebunden die Größe des LRU.
Ich habe das gleiche problem, ich habe versucht, softreferences und was auch immer...
Ich habe das gleiche problem, ich habe versucht, softreferences und was auch immer...
InformationsquelleAutor AlikElzin-kilaka | 2011-04-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
1) Sie haben Ihre eigenen browser.
Laden Sie Ihre Daumen, um die SD-Karte, anstatt halten Sie in RAM. Verkleinern/drehen Sie Sie, bevor Sie Sie speichern, damit beim nächsten laden müssen Sie die Last ist "frei" von der SD-Karte statt teurer aus dem internets. (Sprich: wie alle browser, die Verwendung eines lokalen cache-Datei).
Release zwischenzeitliche Bitmap-Objekte, die Sie erstellen können, um dies zu tun.
Lernen, wie man die "
inSampleSize
" param entpacken Bitmaps mit weniger als der original-Auflösung.Wenn die Dateien, die Sie schreiben, das Ende in einem Bild-Erweiterung (.jpg, etc), die Sie in der Galerie erscheinen werden, also nicht speichern Sie Ihre Daumen mit der Hand Dateinamen.
2) Erstellen Sie eine mehrstufige cache-system (Bitmap > SDCard > Internet).
Beim Auspacken eine Miniaturansicht, speichern Sie es in einer SoftReference-cache. Wenn Sie brauchen, um zu verwenden, Miniatur, Fragen, für die es aus dem cache. Wenn der VM benötigt mehr Speicher, Ihre SoftReference Instanz, möglicherweise null zurückgeben.
Wenn man null von der bitmap-cache, dann prüfen Sie bitte, ob Sie bereits legen Sie Ihre url auf der SD-Karte und laden Sie Sie in der bitmap-cache von dort.
Wenn Sie null aus dem Dateisystem, dann gehen Sie das Bild herunterladen aus dem internet und speichern Sie es auf SDCard und kleben Sie es in Ihrem bitmap-cache.
3) die Freigabe von Ressourcen, die nicht verwendet wird.
In der gleichen Weise, stellen Sie sicher, dass Sie deaktivieren Sie die Bitmaps aus den Ansichten, die Sie platziert wurden, sobald die Aussicht ist offscreen (wenn Sie Ihre Ansichten Leben in einer ListView oder anderen Adapter-basiert element, das ist im wesentlichen "frei" aus recycling-die View-Elemente) -- Allerdings, wenn Sie haben ImageViews instanziiert mit Bitmaps und Sie sind nicht sofort auf dem Bildschirm angezeigt werden, sind Sie wahrscheinlich verschwenden heap.
Rufen Sie einfach an
setImageBitmap(null);
auf eine Bildansicht und die Referenz auf das Bitmap abgelegt werden, (so dass, wenn nur die ref ist der SoftReference, wenn es nicht verwendet wird).4) achten Sie auf welchen thread Sie sich befinden.
Denken Sie daran, Sie muss download bitmaps von einem nicht-UI-thread (wir verwenden eine Service-Instanz zu handeln, wie eine Warteschlange mit Absicht-Anfragen), und Sie muss befestigen Sie die bitmaps, die View-Instanz nur in der UI-thread.
Werden Sie brauchen, um ein gutes Warteschlange system zu laden und alles in ein bitmap-cache aus dem UI-thread und dann mit einem Handler zu sagen, Ihre bitmap-cache zu füllen, die ImageViews auf dem UI-thread.
5) achten Sie auf Ihre download-Warteschlangen.
Wenn Sie wie wir sind, und Sie haben beide Daumen und full-size-Bilder, müssen Sie entweder manuell eine Priorität Warteschlange, um Ihre Bild-Anfragen, bevor dir die Daumen Anfragen, oder verwenden Sie zwei verschiedene Dienste (enqueue getrennte Absichten) herunterladen Daumen vs voller Bilder.
Sonst könnte man Warteschlange, bis ein Bildschirm voller Daumen downloads aber nicht reagieren, mit einem vollen Bild, bis, nachdem alle Daumen komplett.
6) Fragen, das system, wie viel RAM Sie haben.
7) "
onLowMemory()
" nicht tun, was Sie erwarten.Ist es, wenn der Benutzer zu viele Anwendungen auf das Telefon und das OS braucht, sich zu erholen physikalischen Speicher von allen Laufenden apps.
Dies ist völlig getrennt vom laufen aus der Anwendung VM-heap, wie Sie leicht tun mit dem laden zu viele bitmaps.
Zu den besten meines Wissens werden Sie nicht bekommen eine Warnung, Sie werde nur Absturz (tho können Sie verfolgen, Speicher info mit dem oben genannten Aufruf).
Hoffe, das hilft, mit dem Versuch, etwas zu machen, smart zum Download und zur Anzeige der Miniaturbilder aus dem internets.
mig
InformationsquelleAutor mig
Benutze ich SoftReference zu halten, die bitmap-Objekte. Die Liste muss nur die aktuell sichtbare Bilder. Dadurch, dass ich nie brauchen, um sorgen über running out of space.
Minus ist, dass wenn ich die Bilder, Blättern Sie nach unten (was bei einigen SoftReferences zu klar die Bitmaps), dann scrollen Sie wieder zurück an die gleiche Stelle - die Bilder erneut heruntergeladen 🙁
Auch, die SoftReferences bekommen sehr schnell gelöscht. Ich würde erwarten, dass Sie speichern, um das innere bitmap mehr.
Heutzutage verwenden LruCache eher als SoftReferences. Um das problem zu vermeiden, die Sie mit den Referenzen immer gelöscht aggressiver, als Sie erwarten. developer.android.com/training/displaying-bitmaps/...
InformationsquelleAutor AlikElzin-kilaka
Sollten Sie verwenden
inSampleSize
MöglichkeitBitmapFactory.Options
beim erstellen der bitmaps.Auch, einige der Tipps in Android: out of memory-Ausnahme in der Galerie nützlich gewesen, für mich zu halten, eine Kontrolle über den Speicher zur Verfügung.
Natürlich. Und letztlich, du musst halt an einer endlichen Anzahl von Bildern. Die Frage sollte wirklich sein, wie schieben diese Grenze soweit wie vertretbar möglich.
InformationsquelleAutor rajath
Können Sie over-ride die Aktivität
onLowMemory()
Methode für benutzerdefinierte Handhabung solcher SzenarienIch habe nicht diese Methode aufgerufen, nur erhalten OOM-Ausnahme.
onLowMemory() nicht aufgerufen wird, bevor OOM
-1: onLowMemory ist für den gesamten Speicherverbrauch, zwischen all den apps. Das ist nicht das Thema hier. Vielmehr ist DIESE app auf seinem heap begrenzen. onLowMemory wird nicht helfen.
InformationsquelleAutor Swaroop