SORU
22 Aralık 2009, Salı


java.lang.OutOfMemoryError: VM bütçemizi aşıyor bitmap - Android

Android görüntüler çok kullandığı bir uygulama geliştirdim.

App çalışır, ekrandaki bilgileri doldurduğunda (Layouts, Listviews, Textviews, ImageViews, vb) ve kullanıcı bilgilerini okur.

Animasyon, özel efektler ya da doldurmak bir şey yok. Bazen drawables değiştirebilir. Bazı android kaynakları ve bazı dosyalar SDCARD içinde bir klasöre kaydedilir.

Kullanıcı çıkar (onDestroy yöntemi VM bellek tarafından yürütülen ve uygulaması kalır ) ama bir noktadan sonra kullanıcı tekrar girer.

Her zaman kullanıcı uygulaması için girer, hafıza kullanıcı java.lang.OutOfMemoryError gelene kadar daha da büyüyen görebiliyorum.

Birçok görüntüleri işlemek için en iyi/doğru yolu nedir?

Her zaman dolu olan statik yöntemleri koysam? Düzeni temizlemek için ya da özel bir şekilde resim düzeni kullanılır?

CEVAP
21 Temmuz 2011, PERŞEMBE


Android Uygulamaları gelişen bulduğum en sık karşılaşılan hatalardan biri “java.lang.OutOfMemoryError: Boyutu VM bütçemizi Aşıyor Bitmap” hata. Bu hata sık sık yönünü değiştirdikten sonra faaliyetlerini bit eşlem bir şey buldum: Etkinlik, yine yok oluşturulur ve düzenleri “” XML alıcı bir bit eşlem için kullanılabilir VM bellek. şişirilmiş

Önceki aktivite düzenine bitmap düzgün bir etkinlik için başvurular geçti çünkü de-tahsis çöp toplayıcı tarafından değil. Birçok denemeler yaptıktan sonra bu sorun için oldukça iyi bir çözüm buldum.

İlk set “id” XML düzeni üst görünüm nitelik:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:id="@ id/RootView"
     >
     ...

Daha sonra, Aktivite onDestroy() yöntem, unbindDrawables() yöntem üst Görünüm için bir başvuru geçirmeden arayın ve do System.gc().

    @Override
    protected void onDestroy() {
    super.onDestroy();

    unbindDrawables(findViewById(R.id.RootView));
    System.gc();
    }

    private void unbindDrawables(View view) {
        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();
        }
    }

unbindDrawables() Bu yöntem görünümü ağaç yinelemeli olarak ve araştırıyor

  1. Kaldırır tüm arka plan drawables geri aramaları
  2. Çocuklar her viewgroup kaldırır

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Nick Pitera

    Nick Pitera

    8 NİSAN 2006
  • RaverX DouBle StAg XI

    RaverX DouBl

    23 Mayıs 2008
  • ThisWeekYT

    ThisWeekYT

    14 Mart 2013