Утечка растровой памяти в популяции ListView, Android

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

Я в основном использую список массивов растровых изображений, устанавливая его для адаптера с настраиваемой компоновкой строк, переопределяя 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;
    };

person kleaver    schedule 30.12.2011    source источник
comment
Таким образом, сбой является ошибкой нехватки памяти?   -  person Samuel    schedule 30.12.2011
comment
да, outOfMemoryError: растровое изображение превышает бюджет виртуальной машины (heapSize=5639 Allocated=3052 bitmapSize=27141)   -  person kleaver    schedule 31.12.2011


Ответы (1)


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

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

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

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

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

person Cody Caughlan    schedule 17.02.2012