2012-03-21 15 views
6

Uygulamamda basit bir galeri ve hem de kapak kapağında kullanıyorum. Coverflow görüntü galerisinde kapak akışında tıklanmış görüntü var. İçeriğin tam ekran galerisine eklenecek bir sonraki etkinliğe yönlendirildim ve Tam ekran galerimi bile tarayabilirim; ama benim app daha fazla miktarda görüntü veya yüksek çözünürlüklü görüntüler koyduğunuzda bu bitmap boyutu nedeniyle kapanır VM bütçeYığın bellekte dinamik olarak boş bellek nasıl boşaltılır veya temizlenir

aşıyor, böylece her zaman kapak akışı ve galeriyi bitiririm yığın bellek temizlemek istiyorum Benim app herhangi bir miktar veya herhangi bir çözünürlük resmi yüklemek böylece herhangi biri bana yardımcı olabilir ... Benim aktivitemi kodumda dinamik olarak bitirdiğimde her seferinde nasıl yığın bellek boşaltılır/boşaltılır? ben zaten geri dönüşüm ve System.gc yöntemi Sen "yığın temizlemek" olamaz

+0

Sen grafik ve Bitmaplerle hakkında söylediklerini romain adam bakmak okuyabilir. – JoxTraex

cevap

31

çalıştılar. VM, nesneleriniz artık referans alınamadığında bunu otomatik olarak yapar.

Bu söyleniyor, bitmapler android zor bir şey. Sınırlı bellek var ve bir görüntü bir bitmap'e çözüldüğünde sıkıştırılmış görüntü formatının kendisinden çok daha fazla bellek alabilir.

Çözümünüzün kolay bir cevabı yok. Her şeyi doğru bir şekilde yapsanız bile, sadece hafızanız tükeniyor olabilir.

  1. Kullanım Bitmap.release(): söyleniyor, burada bazı ipuçları. bitmapler, doğal yığında (VM'nin karşıtı olarak) ayrılmaları bakımından özeldir. Javadoklar biraz bulanık, normalde buna ihtiyaç duymayacağınızı söylerler, ama deneyimlerimde VM'ye bu "ipucu" ile bitmap'i destekleyen bellek ile yaptığınız önemli. DÜZENLEME: Android 3.0 (API seviyesi 11) itibariyle, piksel verileri ilgili bitmap ile birlikte Dalvik yığınında saklanır.

  2. Bitmap'leri belleğe yükleme ölçekli. İşte konuyla ilgili bir blog post. Bazı aygıtlarda yalnızca 24MB yığın elde edersiniz ve bir yüksek çözünürlüklü görüntü, bir bitmap nesnesine yüklendiğinde tümünü tüketebilir. Bunun bir yolu yok, bu yüzden onu ölçeklendirmelisin. Başka bir cevap söylediği gibi

  3. System.gc() deme. GC algoritmasını oluşturan insanlar siz ve benizden daha akıllılar; Ne yaptığını biliyorlar. Bir GC ile boşaltılabilecek bir bellek olduğunda asla bir OOMA elde edemezsiniz - GC size her zaman bir OOME vermeden önce çalışır.

  4. Bu seferki bariz
  5. , ancak artık gerekli olmayan zaman bitmaplere başvuruları tutan olmadığından emin olun.

  6. Son olarak, bu bir sucks, Android yığın sıkıştırma yapmaz. İşte bir zaman önce, tatmin edici bir cevap vermeden yayınladığım bir SO question. Kısacası, Android hiçbir zaman yığınları sıkıştırmaz, böylece uygulamanız bitmapler için büyük, hatta orta büyüklükte parçalar ayırır, sonunda hafızanız yokken, yeterince büyüklükte olmayan bir durumda bir yere varabilirsiniz. Tahsis için bellek yığını ve ODA olsun. Sorunun içinde yazdığım gibi, sadece bunun etrafında, kullanıcı çıktığı zaman uygulamanın işlemini öldürmektir. Bu, bir dahaki sefere açılış işlemini yavaşlatır, ancak yepyeni bir yığın sağlar. Beni yanlış anlamayın, bunun doğru bir şey olduğuna inanıyorum, ama hiç kimse daha iyi bir çözüm bulmadı.

+1

romain'in bilgisi +1'in iyi bir açıklaması. – JoxTraex

+0

bu "romain'in bilgisi" değildir. ne demek istediğini bilmiyorum. –

+0

O, az önce belirttiğiniz şeyleri temel olarak belirttiğiniz Google'da araç kiti mühendislerinden biridir. Ve onun adı, romainguy. – JoxTraex

İlgili konular