2013-10-30 12 views
6

Zgadnij, co, kolejne pytanie Android-Bitmap-OOM!Zarządzanie pamięcią Android: Zagęszczenie ekranu, żądane rozmiary obrazu i dostępne sterty

Tło

Chociaż stres testów our application to stwierdzono, że możliwe jest, aby maksymalna-out alokacji pamięci procesu w aplikacji po trwałej, w ciężkich warunkach pracy (małpa płozy podobne), z OutOfMemory z wyjątkami zapisywanych w wynikający Ślad stosu. Aplikacja pobiera zdjęcia (około 3 na raz), gdy wybrana jest strona pod numerem ViewPager. Można pobrać ponad 280 obrazów do pobrania, gdy wykonywana jest długość i oddech aplikacji. Aplikacja używa Picasso by Square do pobierania abstrakcji obrazu. W żadnym punkcie kodu aplikacji nie manipulujemy bezpośrednio bitmapami ... wierzymy, że bardzo utalentowani pracownicy Square Inc. robią to lepiej niż my.

Oto obraz

Poniższa fabuła przedstawia alokacje sterty w czasie zarejestrowanego pod komunikatem dalvikvm-heap dziennika. Czerwone kropki wskazuje użytkownikowi przynosząc świeży zestaw wyrobów do stosowania w celu umocnienia ilość prac wybitnego i stresu App ...

DALVIKVM heap allocations http://snag.gy/FgsiN.jpg Rysunek 1: Nexus One przydziałów kupie; Ooms występują w 80 MB +

Badania bieżąco

przeciw Nexus S Nexus 4 Wildfire HTC niesamowite i mnóstwo dodatkowe urządzenia pomiarowe, niepotwierdzone wykazały zarządzania pamięcią być wystarczająca z DVM GC "nadąża" z ciężkimi pracami podnoszenia zakończonymi przez aplikację. Jednak na urządzeniach high-endowych takich jak Galaxy S II, III, IV i HTC One dominują OOM. W rzeczywistości biorąc pod uwagę wystarczającą ilość pracy, wyobrażam sobie, że wszystkie nasze urządzenia będą ostatecznie wykazywać awarię.

Pytanie

Istnieje wyraźna zależność między gęstością ekranu (nasze żądane rozmiary obrazu są oparte off wielkość ImageView), alokacja pamięci procesu i liczba obrazów w danym rozmiarze, że spowodować, że aplikacja przekroczy granice sterty. Zaraz przystąpię do ilościowego określenia tego związku, ale chciałbym, aby społeczność SO rzuciła okiem na ten problem i (a) zgodziła się lub nie zgodziła się, że związek jest warty podjęcia i (b) dostarcza literatury wskazującej, jak najlepiej sporządzić ten związek.

Ważne jest, aby pamiętać, że jeśli zniszczymy jakość obrazu, nasze OOM znikną, ale niestety UX jest uboższy, dlatego chcemy być w kości z najbardziej efektywnym wykorzystaniem dostępnego sterty.


Nota boczna: Oto część kodu odpowiedzialnego za ładowanie tych obrazów do widoków, które zostały ułożone;

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

określenia „ozdobny jakości obrazu” w wymienionej powyżej wystarczy podział imageView.getMeasured... numerem jak „4”.

+0

Picasso zapewnia także migawki ilości pamięci używanej w bitmapach. Jak duże są obrazy, które próbujesz wczytać? Czy są na pełnym ekranie? Nawet najlepsze telefony z mnóstwem pamięci ulegają awarii po załadowaniu trzech lub więcej obrazów. Czy pozytywnie oceniasz swój pogląd przed przywołaniem Picassa? Możesz także spróbować użyć 'fit()'. – dnkoutso

+1

Możesz także rozważyć zbadanie właściwości 'largeHeap', jeśli aplikacja jest bardzo intensywna na bitmapach. Picasso odpowiednio dostosuje pamięć, jeśli jest włączona. Złota zasada dla mnie jest dekodowana tyle, ile potrzebujesz i nigdy więcej. Wygląda na to, że to robisz. Będę bacznie obserwować twoje użycie. W przykładowej aplikacji Picassa, którą testowałem na wielu urządzeniach, nigdy nie dostaję wyjątku OOM i wygląda na to, że urządzenia z najwyższej półki radzą sobie całkiem dobrze z czyszczeniem śmieci. – dnkoutso

+0

Dzięki za radę @ dnkoutso. Picasso osiąga dobre wyniki, o ile wiem; zawsze odzyskuje się po wystąpieniu OOM. Będę informował o moich wyczynach. W interesie; powinienem wyłączyć Picasso w dowolnym momencie? – OceanLife

Odpowiedz

2

Najpierw trzeba zarządzać alokacji pamięci, jego wielki problem w Android jako bitmapy zajmuje dużo wspomnień, w tym alokacji pamięci można zmniejszyć o następujących sposobów

  1. umieścić wszystkie te obrazy, które są ogromne w folderze rozmiaru do zasobu, zamiast umieszczać je w folderze do pobrania. ponieważ zasoby do pobrania pobierają pamięć do ich buforowania. Jeśli załadujesz z folderu zasobów, obraz nie będzie buforowany .i zajmie mniej pamięci.

    1. badania Lrucache, które służą do efektywnego zarządzania pamięcią.
    2. zasoby umieszczone w malutkich formatów dla tej kontroli TinyPNG
    3. jeśli zdjęcia są zbyt duże w rozdzielczości, a następnie spróbuj używać plików SVG do obrazów i plików SVG obciążenie zamiast obrazu. sprawdzić SVG FOR ANDROID

w końcu nie jestem bardzo dobry w języku angielskim nadzieję, może to pomoże.

0

Ten post jest trochę stary, ale ostatnio miałem ten problem. Może to pomoże komuś innemu. Ogólny przegląd tego ogromnego wątku/Co mi pomogło.

-Upewnij używasz Singleton Instancji Picasso

-use Fit()

-dla dużych obrazów lub wielu obrazów lub gdy używany w FragmentPager/StatePager powinieneś używać skipmemorycache() i/lub deklaracja largeHeap:

Przeczytaj wątek, aby uzyskać więcej wskazówek. W chwili opublikowania tego pytania nikt nie opublikował tego numeru na picassos github.

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

Powodzenia Nadzieja to pomaga i szczęśliwy kodowania.