2012-09-12 16 views
6

Tüm etkinliklerimin arka planı olarak ayarlamak için bir görüntü kullanıyorum ancak bu bellek taşmasına neden oluyor ve uygulamayı kilitliyordu. Şimdi benim faaliyetlerimde pause() ve Destroy() üzerinde benim drawables çözme ve şimdi geri düğmesine basarak boş ekran gösterir. Ekstra bellek kullanmadan bunu nasıl önleyebilirim. hep VM bize 10MB tahsis izin vermez söyleyerek hafıza taşması hataya neden olan "/ çekilebilir @" = arka plan Şimdi bir bitmap alıyorum: Bağlantıyı çözme onable onPause() yanıt vermiyor geri gezinme ve bu adımı atlamak bellek taşmasına neden olur

protected void onPause(){ 
    super.onPause(); 
    unbindDrawables(findViewById(R.id.login_root)); 
} 

protected void onDestroy() { 
     unbindDrawables(findViewById(R.id.login_root)); 
     super.onDestroy(); 
     } 

private void unbindDrawables(View view) { 
    System.gc(); 
    Runtime.getRuntime().gc(); 
    if (view.getBackground() != null) { 
    view.getBackground().setCallback(null); 
    } 
    if (view instanceof ViewGroup) { 
     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
     unbindDrawables(((ViewGroup) view).getChildAt(i)); 
     } 
    ((ViewGroup) view).removeAllViews(); 
    } 

Başlangıçta ben robot kullanarak düzeni şişirme edildi (app.) o aşağı ölçekleme ve çalışma zamanında bağlama olmadan çizilebilir.Şimdi VM, unbindDrawables (..) kullanmadan 5MB (app.) tahsis etmemize izin vermez diyor Açıkçası, gösterilen arka plan görüntüsü kalitesi azaldı ama mümkün değil 13KB'lik bir png dosyası kullanıyorum, JVM'nin isteği işlemek için 5 veya 10MB'lik bir alan gerektirdiğini anlamak için?

Yerleşim ifadelerimi onCreate() - onResume() yönteminden kaydırıyorum, ancak uygulama geri düğmesine tekrar basıldığında bellekten siliniyor.

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    protected void onResume(){ 
     setContentView(R.layout.home); 
     Bitmap bmp; 
     ImageView background = (ImageView)findViewById(R.id.iv_home_background); 
     InputStream is = getResources().openRawResource(R.drawable.background); 
     bmp = BitmapFactory.decodeStream(is); 
     background.setImageBitmap(bmp); 

     super.onResume(); 
    } 

protected void onPause(){ 
     super.onPause(); 
     unbindDrawables(findViewById(R.id.home_root)); 
    } 


private void unbindDrawables(View view) { 
     System.gc(); 
     Runtime.getRuntime().gc(); 
     if (view.getBackground() != null) { 
     view.getBackground().setCallback(null); 
     } 
     if (view instanceof ViewGroup) { 
      for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
      unbindDrawables(((ViewGroup) view).getChildAt(i)); 
      } 
     ((ViewGroup) view).removeAllViews(); 
     } 
    } 
+0

OnDestroy() çağrılırsa onPause() daha önce çağrıldığını unutmayın. –

+0

sadece @OohnSatriano'nun belirttiği gibi "onPause()" da görüldüğü gibi. Ama yine de, onResume işlevinizi bize gösterme –

+0

Devam etme işlevimi geçersiz kılmadım. Orada ne yapacağım konusunda hiçbir fikrim yok. – Atinder

cevap

1

Bu sorunla ilgili bir iş buldum. Şimdi bitmaplerimi çalışma zamanında çok küçük bir boyuta ölçeklendiriyorum ve daha sonra bunları dahili depolama biriminde saklıyorum. Program, çalışma zamanında depodan ölçeklenmiş bitmap'leri çağırır ve eğer orada bulunmazsa, onu çekilebilir klasörden çağırır, ölçeklendirir, depoya yazar ve daha sonra görüntüye bağlar. Bu şekilde, herhangi bir zamanda unbindDrawables yöntemini çağırmaya gerek yoktur ve uygulama, yanıt vermeye devam eder. Şu andaki tek endişem, bitmap'lerin kalitesidir, maksimum kalite ile mümkün olan en küçük boyutu bulmak için ölçekleme boyutuyla oynamak zorundayım.

0

Her alt görünüm için GC'yi çağırıyorsunuz. Bütün açılmalar bittiğinde sadece bir kez çağırmayı deneyin.

GC ağır bir yüktür ve çok sık çağırmak işe yaramaz. Aslında, herhangi bir sızıntı yoksa, kesinlikle nesnel olmalıdır.

Ayrıca, png dosya boyutlarının bellekte bitmap ile bir ilgisi olmadığını unutmayın. Burada daha fazla bilgi bu http://developer.android.com/training/displaying-bitmaps/index.html

İlgili konular