2011-06-07 12 views
8

Uygulamamız çok fazla bitmap kullanıyor. Örneğin G1, XOOM'da çalışıyor. Ancak HTC Desire'da bir OutOfMemory hatası var. Kodda try/catch (OutOfMemoryError e) ve tüm cihazlar (Desire hariç) istisnasını kullanırız, ancak HTC, uygulamayı OOM istisnası olmadan sadece öldürür. Bitmap'lerin belleğini 12 Mb'ye sınırladık ve bu çözümün sorunu çözdüğünü görüyoruz, ancak müşteri hala HTC Desire HD'de sorun yaşıyor. 12 Mb kısıtlamayla bile OOM var. Burada günlükleri:Android için bitmap için ne kadar boş yığın boyutu bulunduğunu nasıl bulabilirim 2. *?

06-07 12:03:43.978 E/dalvikvm-heap(29616):1140128-byte external allocation too large for this process. 
06-07 12:03:43.978 E/dalvikvm(29616):Out of memory: Heap Size=12311KB, Allocated=9420KB, Bitmap Size=12139KB, Limit=21884KB 
06-07 12:03:43.978 E/dalvikvm(29616):Trim info: Footprint=15751KB, Allowed Footprint=15751KB, Trimmed=3440KB 
06-07 12:03:43.978 E/GraphicsJNI(29616):VM won't let us allocate 1140128 bytes 

AFAIK cihazlar için farklı yığın boyutu sınırlamalar vardır (G1: 16MB Droid: 24 MB Xoom 48 mb). Benim görüşüme göre sistem en az 16 mb vermeli, ama 12mb ile OOM var. Sorum şu: Android için bitmap için kaç tane bedava yığın boyutu bulunduğunu nasıl öğrenebilirim? *? Ya da lütfen başka yollarla bu tür sorunlardan nasıl korunacağınızı önerin. FYI, özellikle diğer cihazlarda iyi çalışıyorsa daha az bitmap kullanamıyoruz. Herhangi bir yardım için şimdiden teşekkür ederiz!

Sen hangi zaman Aktivite ne olacağını işleyebilir, etkinlik'ın

onLowMemory(); 

yöntemi geçersiz kılabilirsiniz

Runtime.getRuntime().maxMemory(); 

deneyin ya

getMemoryInfo(ActivityManager.MemoryInfo; 

yanında etkinlik'ın yöntem olabilir

cevap

2

kapatılmadan önce, bellek sorunu bildirilir. Ayrıca Android/Linux belleğindeki bir Android devresinden de bu answer'u kontrol etmelisiniz.

+1

AFAIK bitmapler dış yığına ayrılır. Bu yöntemler, bir uygulamanın "normal" ve harici yığın bilgisini verirse, Dunno. Ayrıca bakınız: [bu gönderi] (http://stackoverflow.com/questions/1945142/bitmaps-in-android) – icyerasor

+0

Gerçekten de yerel yığınlar üzerinde tahsis edilmiştir. Ancak en azından Bitmap'in Honeycomb öncesi sürümleri için, yerel bitmap kodu, piksel verilerinin Java kodundan istenmesi durumunda (setPixel, getPixel vb.), Aynı miktarda Java yığınını (bir dizi olarak) ayırmayı garanti eder. Bu durumda JNI yerel piksel verilerini Java alanına kopyalar, bu nedenle mevcut Java yığın alanını da kontrol etmek gerekir. – tiguchi

0

Bu OutOfMemory istisnası, dosyanın kendisinden değil, bellek sızıntısından kaynaklanır. OnStop, onResume, onDestroy gibi etkinlik yaşam döngüsü yöntemlerini geçersiz kılıyor musunuz?

+2

Hiç işe yaramıyor. Bir 8MP görüntüyü yüklemeyi denerseniz, bir OOM'a sebep olacaksınız. Sızan kod olmak zorunda değil. – Bostwickenator

İlgili konular