2010-10-18 10 views
7

Mam więc leniwy program ładujący obrazy dla mojego ListView. Używam również this tutorial dla lepszego zarządzania pamięcią i mam SoftReference obrazy bitmap przechowywane w moim ArrayList.java.lang.OutOfMemoryError: rozmiar bitmapy przekracza budżet maszyn wirtualnych

My ListView działa ładuje 8 obrazów z DB, a następnie, gdy użytkownik przewija do końca, ładuje kolejne 8 itp. Nie było problemu, gdy było około 35 obrazów lub mniej, ale więcej i moja aplikacja Force Closes with OutOfMemoryError.

Rzeczą, że nie mogę zrozumieć to mam kodu wewnątrz połów Spróbuj:

try 
{ 
    BitmapFactory.Options o = new BitmapFactory.Options(); 
    o.inJustDecodeBounds = true; 
    BitmapFactory.decodeByteArray(image, 0, image.length, o); 

    //Find the correct scale value. It should be the power of 2. 
    int width_tmp = o.outWidth, height_tmp = o.outHeight; 
    int scale = 1; 

    while(true) 
    { 
     if(width_tmp/2 < imageWidth || height_tmp/2 < imageHeight) 
     { 
      break; 
     } 

     width_tmp/=2; 
     height_tmp/=2; 
     scale++; 
    } 

    //Decode with inSampleSize 
    BitmapFactory.Options o2 = new BitmapFactory.Options(); 
    o2.inSampleSize = scale; 
    bitmapImage = BitmapFactory.decodeByteArray(image, 0, image.length, o2);   
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 

ale blok try catch nie jest łowienie wyjątek OutOfMemory iz tego co rozumiem SoftReference bitmapy powinno zostać wyczyszczone, gdy w aplikacji kończy się pamięć zatrzymująca wyjątek OutOfMemory.

Co ja tu robię źle?

Odpowiedz

4

OutOfMemoryError to błąd nie jest wyjątkiem, nie należy go łapać.

zobaczyć http://mindprod.com/jgloss/exception.html

EDIT: znany problem zobaczyć this issue

+0

Ah mój zły ... w ogóle o tym nie wiedziałem. Czy jest coś, co mogę zrobić, aby temu zapobiec? Całkowicie utknąłem. – mlevit

+0

To ma sens, aby złapać OutOfMemoryError, jeśli ktoś ma sposób na rozwiązanie problemu lub jeśli chce powiedzieć użytkownikowi, na przykład, rozpoczynając nowe działanie w oddzielnym procesie. – arberg

9

przypuszczam może być ten post pomoże

//decodes image and scales it to reduce memory consumption 
private Bitmap decodeFile(File f){ 
    try { 
     //Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(f),null,o); 

     //The new size we want to scale to 
     final int REQUIRED_SIZE=70; 

     //Find the correct scale value. It should be the power of 2. 
     int width_tmp=o.outWidth, height_tmp=o.outHeight; 
     int scale=1; 
     while(true){ 
      if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) 
       break; 
      width_tmp/=2; 
      height_tmp/=2; 
      scale*=2; 
     } 

     //Decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize=scale; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } catch (FileNotFoundException e) {} 
    return null; 
} 
+0

+1 Bardzo pomocne rozwiązanie. Pracuje dla mnie. Thanx –

+0

+1 Ten przykład działa również dla mnie. Dziękuję Ci! – ScratchMyTail

+0

Powinien być wybranym rozwiązaniem! – Pascal

0

błędów i wyjątków są podklasy z Throwable. Błąd powinien być tak drastyczny, że nie należy ich łapać.

Ale możesz złapać wszystko.

try 
{ 
} 
catch (Throwable throwable) 
{ 
} 
Powiązane problemy