2013-10-30 9 views
6

Rate mal, eine andere Android-Bitmap-OOM-Frage!Android Speicherverwaltung: Bildschirmdichte, angeforderte Bildgrößen und verfügbaren Heap

Hintergrund

Während Stress our application Prüfung darauf hingewiesen wurde, dass es der App zu max-out-Prozess Speicherzuweisung nach nachhaltigen, starken Nutzung (Affe Läufer wie) möglich ist, mit OutOfMemory Ausnahmen innerhalb der folgenden aufgezeichnet werden Stapelverfolgung. Die App lädt Bilder (ungefähr 3 gleichzeitig) herunter, wenn eine Seite unter ViewPager ausgewählt wird. Es können mehr als 280 Bilder zum Herunterladen zur Verfügung stehen, wenn die Länge und der Atem der App ausgeübt werden. Die Anwendung verwendet Picasso by Square für die Bild-Download-Abstraktion. Bemerkenswerterweise manipulieren wir Bitmaps zu keinem Zeitpunkt im Code unserer Anwendung ... wir vertrauen darauf, dass die sehr talentierten Mitarbeiter von Square Inc. es besser machen als wir es können. Hier

ist ein Bild

Die untere Kurve der Heapzuweisungen im Laufe der Zeit zeigt unter der Protokollmeldung dalvikvm-heap aufgezeichnet. Die roten Punkte zeigen einen Benutzer, eine neue Reihe von Gegenständen in die Anwendung, um die Menge an Arbeit, das hervorragenden und Stress app ...

DALVIKVM heap allocations http://snag.gy/FgsiN.jpg 1 bringen zu polstern: Nexus One Heapzuweisungen; Ooms treten bei 80MB +

Investigation to-date

gegen einen Nexus S, Nexus 4, Wildfire, HTC Incredible und eine Vielzahl weiterer Testgeräte, anekdotisch Tests, um die Speicherverwaltung mit der als ausreichend gezeigt hat DVM GC "hält" mit den schweren Hebearbeiten, die von der App erledigt werden. Auf High-End-Geräten wie dem Galaxy S II, III, IV und HTC One sind die OOM jedoch vorherrschend. In der Tat genug Arbeit gegeben zu tun, würde ich mir vorstellen, alle unsere Geräte würden schließlich den Fehler zeigen.

Die Frage

Es gibt eindeutig eine Beziehung zwischen Rasterdichte (unsere forderter Bildgröße der Größe des Image off basieren), würde die Prozess Speicherzuweisung und die Anzahl der Bilder bei einer bestimmten Größe, das dazu führen, dass die App ihre Heap-Grenzen überschreitet. Ich bin dabei, diese Beziehung zu quantifizieren, möchte aber, dass die SO-Community ihre Augen auf dieses Problem richtet und (a) zustimmt oder widerspricht, dass die Beziehung lohnend ist und (b) Literatur liefern, die zeigt, wie diese Beziehung am besten erstellt werden kann.

Es ist wichtig zu beachten, dass, wenn wir die Bildqualität zerstören unsere OOM alle verschwinden, aber leider ist die UX ärmer, weshalb wir mit dem effektivsten Gebrauch des verfügbaren Heap würfeln wollen.

Seitennotiz: Hier ist der Teil des Codes verantwortlich für das Laden dieser Bilder in die Ansichten, die ausgelegt wurden;

picassoInstance.load(entry.getKey()) 
       .resize(imageView.getMeasuredWidth(), 
         imageView.getMeasuredHeight()) 
       .centerCrop() 
       .into(imageView); 

Die ‚flott der Bildqualität‘ oben erwähnt ist einfach die imageView.getMeasured... durch eine Zahl wie ‚4‘ geteilt wird.

+0

Picasso bietet auch Momentaufnahmen, wie viel Speicher für Bitmaps verwendet wird. Wie groß sind die Bilder, die Sie laden möchten? Sind sie Vollbild? Selbst die besten Handys mit viel Speicherplatz stürzen ab, wenn drei oder mehr Bilder geladen werden. Sind Sie sicher, dass Ihre Meinung gemessen wird, bevor Sie Picasso anrufen? Sie können stattdessen auch versuchen, 'fit()' zu verwenden. – dnkoutso

+1

Sie können auch die Eigenschaft 'largeHeap' untersuchen, wenn Ihre Anwendung sehr intensiv Bitmaps verwendet. Picasso passt den Speicher entsprechend an, wenn dies aktiviert ist. Die goldene Regel für mich ist, so viel zu dekodieren wie du brauchst und nie mehr. Es scheint, als ob du das tust. Ich würde Ihre Verwendung genau beobachten. In der Beispiel-App für Picasso, die ich auf mehreren Geräten getestet habe, bekomme ich nie eine OOM-Ausnahme und es scheint, dass High-End-Geräte ziemlich gut damit umgehen, den Müll aufzuräumen. – dnkoutso

+0

Danke für den Hinweis @dnkoutso. Picasso funktioniert gut, soweit ich das beurteilen kann; wird immer wiederhergestellt, wenn OOMs auftreten. Ich werde Sie über meine Heldentaten auf dem Laufenden halten. Aus Interesse; Soll ich Picasso an irgendeinem Punkt explizit schließen? – OceanLife

Antwort

2

Zuerst müssen Sie die Erinnerungen Zuordnung, es ist ein großes Problem in Android verwalten als Bitmaps viele Erinnerungen, für die Speicherzuweisung erfolgt durch folgende Weise reduzieren kann

  1. diese Bilder setzen alle, die sehr groß sind Größe in Assets Ordner, anstatt sie in Drawable-Ordner zu setzen. Da ausschreibbare Ressourcen Speicherplatz für die Zwischenspeicherung benötigen, wird sie beim Laden aus dem Asset-Ordner nicht zwischengespeichert und benötigt weniger Speicherplatz.

    1. Studie Lrucache, die für die effiziente Speicherverwaltung verwenden.
    2. Put-Ressourcen in kleinen Formaten für die Überprüfung TinyPNG
    3. wenn Ihre Bilder in der Auflösung zu groß sind, dann versuchen, SVG-Dateien für Bilder und Last SVG-Datei statt Bild zu verwenden. dies überprüfen SVG FOR ANDROID

i schließlich bin nicht sehr gut in Englisch hoffe, es kann Ihnen hilft.

0

Dieser Beitrag ist ein wenig alt, aber ich hatte auch dieses Problem vor kurzem. Vielleicht hilft das jemand anderem. Allgemeiner Überblick über diesen großen Thread/Was mir geholfen hat.

-Stellen Sie sicher, dass

-Use Sitz()

-Für große Bilder oder viele Bilder eine Singleton Instanz von Picasso verwenden oder wenn in einem FragmentPager/StatePager verwendet werden, sollten Sie wahrscheinlich skipmemorycache() verwenden, und/oder largeHeap Deklaration

Lesen Sie den Thread für weitere Tipps. Zu der Zeit, als diese Frage gestellt wurde, hatte niemand dieses Thema auf Picassos Github gepostet.

https://github.com/square/picasso/issues/305

Viel Glück Hoffnung, das hilft und glücklich Codierung.