Оценете темата:
  • 0 гласа - средно 0
  • 1
  • 2
  • 3
  • 4
  • 5

ImageView outofmemory
#1

Имам приложение, което на емулатор с 1GB рам и на по нови телефони няма проблем, но на емулатор с 512 рам и малък екран ми прави проблем. Предполагам ще го прави и на устройства с малко рам. Грешката, която дава е outofmemory bitmap size exceeds vm budget. В приложението имам много imageView-та. Самите картинки не бих казал, че са много големи файлове. Всяко imageView го задавам с imageView.setImageResource();. никъде не използвам System.gc(), или не давам recycle(). Та въпроса ми е, има ли по добър вариант да задавам imageView-тата за да избегна тая грешка. или трябва някъде да ги unset-вам. Как да избегна проблема с паметта. В самото приложение освен началното сетване на картинките по време на ползане също променям някои картинки. Може би преди да сетвам новата картинка да давам Null на imageView-то?!? Как според вас да избегна грешката?
Цитирай
Аксесоари
#2

http://developer.android.com/training/di...index.html

Тук нещата са доста добре обяснени. Има и приемерен апп.
Цитирай
#3

това го пробвах, но при него още отначало на второто пускане активитито ме изхвърля. забравих да спомена, че още в onCreate зареждам всички картинки, и след това когато ми се наложи ги използвам. Може би и за това крашва като използвам това горе, защото още отначало се мъчи да зареди към 20 bitmap-а. а иначе до сега отначало си set-вам всеки ресурс към Int променлива и когато ми се наложи го слагам на imageView. при тоя случей обаче по някое време явно се препълва паметта (не рамта, а vm бюджета). и то препълването става след стартиране на активитито няколко пъти. демек пускам приложението, влизам в настройки 5-6 пъти (главното активити се унищожава и създава наново) и на 6-тото влизане да кажем, ако поцъкам малко в главното активити и дава грешката...

п.п. освен кода на по горния линк, пробвах и да дам recycle на всеки битмап в onDestroy. тогава ми зарежда самото activity колкото искам пъти, но пък ме изхвърля като поцъкам малко
Цитирай
#4

забелязах, че проблема идва от heap size-а. пуснах да ми го логва. след всяко влизане в настройките на приложението и след това връщане към главното активити, heap size-а се увеличава до момента, в който на емулатор с 16mb heap size ме изхвърля (5-6 стартирания на главното активити). на емулатори и устройства с повече heap size явно няма проблем. но при всяко стартиране на главото активити, тоя heap се пълни и няма ли как да го изчистя. да кажем в onDestroy няма ли как да извикам някоя функция, която да освободи паметта?
Цитирай
#5

Ако използваш последната версия на АС там се логва CPU и memory usage и можеш да си ги следиш по време на работа на приложението. ( Без да стартираш в дебъг мод )
Като цяло проблемът ти идва от самите картинки, че са много големи за устойствата, на които ги пускаш. Една 100 кб картинка с компресия jpg, като се разпакетира в паметта заема 1 МБ, което не е малко, а ти ако имаш много такива ( както е може би в твоя случая ) ще береш ядове.

Относно heap-a: Приложението ти се стартира с 12 или 16 МБ хиип. Ако му е необходимо повече, то ОС-то му го дава. Ако започнеш да ползваш повече от 80 % от наличния heap, то той се увеличава автоматично и така докато не се удари тавана на heap-a, който не е малък.

При теб проблемът ми се струва, че е следният: Опитваш се да заредиш голямо количество данни, а нямаш толкова свободен heap. Пример зареждаш 1 МБ картинка, която като се разпакетира в паметта ще стане около 10 МБ, а състоянието на heap-a е 12 / 14 МБ ( use / size ). Т.е ОС - то не може да реягира на твоя рекуест за памет и приложението тряска с OFM,
а не поради причината, че си запълнил целият heap.

Имам три предложение.
1. Да си разпределиш за различните устройства mdpi, hdpi, xhdpi, и тн. съответните ресурси.
2. Използва android:largeHeap="true" в <application /> на манифеста файла
3. Преди да заредиш картинките си създаваш битмапи, като ги downscale-ваш до точния размер на ImageView ( има си методи, можеш в гоогле да видиш как става без да разпакетираш цялата картинка )
Цитирай




Потребители разглеждащи темата: 1 гост(и)