2015-01-13 19 views
6

İçerik görünümünü ayarlarken bu özel durumu anladım. Zaten bu durum işlenecek çalıştık:java.lang.outofmemoryerror android.graphics.BitmapFactory.nativeDecodeAsset (Yerel Metot)

try{ 
    setContentView(R.layout.activity_main); 

}catch (OutOfMemoryError e) { 
     e.printStackTrace(); 
    } 

Bu istisna 100 zamanın dışında yaklaşık Testlerde 5 geldi. ancak bu sorunu çözemiyorum. Bu hatanın bu tür gidermek için çeşitli yollar vardır

+1

activity_main –

+2

'da küçük boyut/resoulution görüntünün kullanılması nedeniyle, görüntü çözünürlüğüne veya OutofMemoryError –

+1

Hi Arslan'a neden olan izin verilen bellek boyutuna göre çok yüksek çözünürlükte/boyutta bir resim yüklüyorsunuz. Lütfen resimlerinizin çok yüksek boyutta olmadığını kontrol edin ve 9Patch görüntüleri mümkün olduğunca kullanmaya çalışın. Kesinlikle hafıza tüketimini azaltacaktır. – droidd

cevap

9

:(üzerinde veya başka bir şekilde benim QA ekibi beni öldürecek Genellikle Lütfen resim çözünürlüğü Düzeninize çok yüksek olduğundan İşte seçenekleriniz:..

  1. düşük çözünürlüklü görüntü (daha az piksel). Yani, kabul edilebilir olmayabilir isteyin ama takım bellek kısıtlamaları bilincinde olmalıdır.

  2. düzenden resim (ler) çıkarın, ancak ImageView unsurları bırakın Eğer varsa, arka plan varsa, arka planı kaldırın ve daha sonra görüntüleri etkili şekilde yüklemek için java'yı kullanın. yapmasıdır. Yüklemeden önce resimlerin istediğiniz öğelerin ekran boyutunu ve/veya boyutunu ölçmeniz gerekir. Android dokümanlar burada büyük bir örnek vardır:

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

  1. uygulamanız için "heapSize" arttırın. Bu bir son şans! Aksi takdirde, muhtemelen gelecekte aynı hatayla karşılaşacaksınız ve sonra yukarıdaki yöntemlerden birini kullanarak çözmeniz gerekiyor ... ve QA'nız gerçekten o zamandan hoşlanmayacak!

How to increase heap size of an android application?

Ayrıca başka ekrandaki görüntüleri başvuran veya başka bir bellek sızıntısı var ki mümkündür, sen herhangi/tüm kodu incelemeniz gerekir ki bu durumda: İşte heapSize bir referanstır Bu sızıntıların nerede olduğunu bulmak için bundan önce (diğer faaliyetler dahil) çağrıldı. Muhtemel nedenler, Activity'un bir İçerik iş parçacığına veya hizmete geçirilmesi değil, yalnızca İçeriği geçirme, görüntülere statik başvurular oluşturma, WeakReference, diğer iş parçacıklarına/işlemlerine geçirilen büyük bellek nesnelerini veya nesnelerin başvurularındaki diğer alışılmadık yaklaşımları işlemek gibi şeylerdir. .

1

Sağlanan kod, OutOfMemoryError nedeninin nedeni değildir. OutOfMemory'nin birincil nedeni, JVM GC'nin işleminizin devam etmesi için yeterli belleği serbest bırakamamasıdır.

SetContentView'ın gerçekten ağır bir işlem olduğu ve görüntünün çözünürlük boyutunun azalacağı varsayılırsa, bir süre çözülür, bu sorun sistemde farklı bir yerde farklı bir zamanda tekrar görünür.

GC'nin neden yeterince yer ayıramayacağını belirtebilirsiniz, genellikle bu, kodunuzda GC'inize yardımcı olmak için temizlemeniz gereken, kodunuzda eski bir referansınız olduğu anlamına gelir.

Uygulamanız için alanın nasıl ayrıldığını ve temizlendiğini izlemek için uygulamanız için bir profil oluşturucu kullanmanızı öneririm. Varsayılan olarak android ile standart bir tane var.

2

Diğerleri tarafından da belirtildiği gibi, bu uygulama bellek sızıntısı yaşıyor veya uygulamanız çok fazla bellek kullanıyor çünkü oluyor.

Yerleşim dosyanızdaki katman sayısını azaltmaya çalışın, bu büyük olasılıkla sorunu çözer. Bu, MAT eklentisini yüklemezse, bunu kullanarak çalışma zamanında uygulamanız tarafından kullanılan bellek miktarını kontrol edebilirsiniz. sizin düzeni dosyasında katman sayısını azaltın o büyük olasılıkla

çalışacak: Bir önceki aktivitenize belleği serbest değil veya görünümleri düzgün liste/ızgara geri dönüşümlü edilmiyor

PS önce açılmış ihtimali olabilir

İlgili konular