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.
(ç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? –
Bitmap'inizi nasıl çiziyorsunuz? SetImageBitmap aracılığıyla bir ImageView'a eklenmiş mi? – Freddroid
Kullanıcı döndükten sonra, onu tutan görüntüye ne olur? –