2012-08-14 42 views
5

Android'in API 10'undan önce, gerçek ham verilerin yerel bellekte depolandığından, artık kullanılmayan Bitmap s için recycle() numaralı telefonu aramak önemliydi.API 11+ üzerinde bitmap.recycle() işlevi nedir?

Ancak API 11 itibariyle Bitmap s yığın saklanır, böylece sorum şu:

hala API yeterince büyükse Bitmap s tarihinde recycle() çağırmak için gerekli mi (en az 11)? Bu API’da ararsam ne yapar?

+0

"10'dan önce geri dönüşüm() 'i çağırmak önemliydi" dediğinizde bu, eğer hafıza olmazsa, asla boş bırakılmayacaksınız demektir? Resmi dokümanlar, "önerilen" olduğunu söylüyor, ancak bitmapi yerel bellekte ayırırsa, geri dönüşüm() için bir çağrı olmadan nasıl serbest bırakılacağını anlamıyorum. – Tiago

+0

@Tiago Bu dersi izleyebilirsiniz: https://www.youtube.com/watch?v=_CruQY55HOk#t=656. Bitmap'ler yığın içinde çok küçük bir yer kapladı, ancak piksel verileri (yığının OOM mekanizmasının bir parçasıydı) olmadı, bu yüzden GC, durumun ne kadar iyi/kötü olduğunu bilmiyordu ve eğer değilse Birden çok bitmap oluştururken tetiklenir, kolayca OOM alabilirsiniz. Bu yüzden "geri dönüşüm" olarak adlandırmak önemlidir, böylece en kısa sürede bitmapleri temizler (çünkü GC işi iyi yapmadı). –

+0

Ah, anlıyorum. Bu birçok şeyi açıklıyor. OutOfMemory istisnasının hem yığın hem de yerel bellek için sayılacağı ve GC'nin yalnızca yığına bakacağı oldukça garip. Honeycomb + 'dan sonra, bitmaplerin piksel verileri de yığın halinde, sonra GC işini doğru yapabilir. Ne dağınık, hehe! Netleştirdiğiniz için teşekkürler! – Tiago

cevap

5

Resmi belgeler, recycle() şimdi gelişmiş bir çağrı olduğunu bildirir; böylece bitmap'inizi boşaltmak isterseniz, bitmap = null gibi bir şey yazabilirsiniz ve GC, diğer her şeyle ilgilenir.

+0

anlıyorum . Yani geri dönüşüm hala hafızasını hala serbest bırakacak mı? –

+0

Evet, geri dönüşüm, GC'ye bakmayan belleği serbest bırakır, bu nedenle bu aramaya dikkat etmeniz gerekir. – s0nicYouth