2012-11-04 12 views
7

Ben çoğunlukla eğlenmek için bir eskiz uygulaması yapıyorum. Ama ben bir sorunla karşılaştım.Android deallocate Bitmap'ler "bilinmeyen" belleğe giriyor

Uygulamam içinde, kullanıcı daha önce çizdikleri eskizleri "çevirebilir". Bu eskizler sadece 400x800 Bitmaps'dir. Ama sürekli bellek hatalarından kaçıyordum.

Skeçler en kısa sürede kullanıcı onlardan uzak çevirir olarak SD kaydedilir ve bunlar daha sonra

if(bitmap != null) 
{ 
bitmap.recycle(); 
bitmap = null; 
} 

Yani, sadece bir veya iki Bitmap herhangi bir belleğe yüklenen edilmelidir ... ile ayırmanın zaman, kurtarılmadan ve dağıtılmadan önce. Ve birkaç hata ayıklama baskısıyla, bunun doğru olduğunu belirledim (aynı anda bellekte en fazla iki bitmap). Benim sorunum, 14 yük/ayrılma işleminden sonra, programın bir OutOfMemoryError ile çökmesidir. Her zaman 14, ne kadar uzun olursa olsun "çevirir".

Aygıtın bellek ayırma şeklini görmek için DDMS'yi açmayı denedim. Garip bir şekilde, bir görüntü ayrılmışsa, bellek "serbest" bölüm yerine "bilinmeyen" bölümüne gider. Bu, sadece "serbest" bir bellek kalıntısı kalmayıncaya kadar devam eder, bu noktada çarpışma gerçekleşir (ve "bilinmeyen" bellek "serbest" e gider).

Çok fazla uğraştan sonra, bitmap'lerin deallocated as expected ve Dalvik garbage collections always occur before an out of memory error olması gerektiğini belirten birkaç kaynak buldum. Ve bir bitmap tarafından kullanılan TÜM bellek Ben iki farklı telefonlarda test ediyorum ki bu noktada belirtmeliyiz

GC (hem yerli ve JVM yığın) üzerine serbest bırakıldığını öne bazi muhtelif sayfalar. Motorola Droid X (stok görüntü, Android 2.3.3) ve Samsung Galaxy S3 (Cyanogenmod 9, Android 4.0.4). Her ikisi de aynı davranışı sergiler. Android araçlarım tüm SDK sürümleriyle günceldir ve kodumda başka hiçbir şeyin garip tahsisat yapmamasını sağlamak için milyonlarca kez kontrol ettim (program başlangıcından sonra neredeyse hiçbir şey ayrılmaz).

, nasıl bir bitmap'i serbestçe ayırmalıyım (böylece sadece "bilinmeyen" değil) ve hafızayı başka bir yerde kullanabilir miyim? Bir çeşit ek soru olarak, bu "bilinmeyen" bellek havuzu nedir ve ne için?

DÜZENLEME: Dilbilgisi ve yazım, platform üzerine bazı notlar ekledi.

+1

(çok karmaşık çünkü ve daha diğer görünümleri gerekir) ImageView kullanmayın gör özel kullanmak yerine true.and, ancak hiçbir şans kullanımı olabilir - DDMS'de hiçbir "bilinmeyen" bellek göremiyorum. İstatistik tablosunda görüntülenen "bilinmeyen nesne" satırına mı bakıyorsunuz, btw? 'Bitmap' örnekleri oluşturmak için kullandığınız kodu göstermeyi düşünüyor musunuz? –

+0

Bitmap'inizi nasıl çiziyorsunuz? SetImageBitmap aracılığıyla bir ImageView'a eklenmiş mi? – Freddroid

+0

Kullanıcı döndükten sonra, onu tutan görüntüye ne olur? –

cevap

0

Büyük resmi kullanın (ayrıca 1mb'ye yakın). Şimdiye kadar AndroidManifest uygulama etiketi ayarlamak büyük yığın senin sorunu yeniden oluşturmaya çalıştık

İlgili konular