Утечка растровой памяти в ListView, Android - PullRequest
1 голос
/ 30 декабря 2011

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

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

1 Ответ

1 голос
/ 17 февраля 2012

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

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

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

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

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

...