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”.
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
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
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