2011-12-30 3 views
1

Ненавижу публикацию избыточных вопросов, но я не могу на всю жизнь понять, как не иметь слишком много битмап-памяти в куче. Он отлично надувается на первом onCreate, но второй раз он терпит неудачу. где/когда я перерабатываю эти вещи, @_o lolУтечка памяти растрового изображения в популяции ListView, android

Я в основном использую список массивов растровых изображений, устанавливая его на адаптер с настраиваемой строкой строки, переопределяя getView.

** Используемые растровые изображения являются jpeg с SD-карты // в основном вертикально прокручивающейся галереей.

 mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     setListAdapter(getAdapter()); 
    }//on create 


    private ArrayAdapter<Bitmap> getAdapter(){ 
     ArrayList<Bitmap> picsII = new ArrayList<Bitmap>(); 
     String DIRECTORY_PATH = "/sdcard/Mustaches/"; 
     File file = new File(DIRECTORY_PATH); 
     final String[] s = file.list(); 

     for(int i = 0; i<s.length; i++){ 
      Bitmap b = BitmapFactory.decodeFile(DIRECTORY_PATH + s[i]); 
      picsII.add(b); 
     } 
     adapter = new ArrayAdapter<Bitmap>(this, R.layout.row, picsII){ 

      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
      View row; 

      if (null == convertView) { 
      row = mInflater.inflate(R.layout.row, null); 
      } else { 
      row = convertView; 
      } 


      ImageView iv = (ImageView) row.findViewById(R.id.imageView_row); 
      iv.setImageBitmap(getItem(position)); 

      //some other widgets such as buttons and textviews 
      //from the custom row are inflated here 


      return row; 
      } 
     }; 

     return adapter; 
    }; 
+0

Таким образом, отказ является ошибкой памяти? – Samuel

+0

yes, outOfMemoryError: битмап превышает бюджет vm (heapSize = 5639 Выделено = 3052 bitmapSize = 27141) – kleaver

ответ

1

Ваша проблема в том, что вы с нетерпением загружаете все растровые изображения, когда, вероятно, вы показываете только пару за раз.

Это вы декодируете все растровые изображения в массив, прежде чем вы покажете их. Это может легко исчерпать всю вашу память.

Подход, который вы хотите использовать, просто загружает изображения для отображаемых строк ListView.

Посмотрите на эту статью для лучшего решения, которое включает загрузку изображений в фоновый поток и сохранение кеша.

http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

Смежные вопросы