как очистить кэшированные изображения в Android? - PullRequest
0 голосов
/ 28 мая 2010

Как программно очистить кэшированное изображение из памяти в Android?

У меня есть ListView со значками, когда я прокручиваю его, он перезагружает изображение.Так что его производят OutofMemoryError.Я хочу очистить кеш, пока получаю это исключение.как это сделать?любая помощь?

РЕДАКТИРОВАТЬ:

Я просто использую этот код в моей программе для загрузки изображения: http://ballardhack.wordpress.com/2010/04/10/loading-images-over-http-on-a-separate-thread-on-android/

Ответы [ 3 ]

2 голосов
/ 29 мая 2010

Вы повторно используете растровые объекты в ListView?

Ромэн Гай говорил о том, насколько это важно для памяти и плавной работы, в своем выступлении на Android по макетам и представлениям в Google I / O в прошлом году.

По сути, у вас должно быть определенное количество растровых объектов (он использовал 8), и каждый раз, когда вы загружаете следующее изображение при прокрутке, оно должно переходить в объект, который только что исчез.

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

2 голосов
/ 18 октября 2010

Да ... известная «проблема», допустим, это поведение ListView.

Как это исправить:

  1. Посмотрите первые 15 минут видео в соответствии с предложением @HXCaine, которое объясняет ViewHolder.

  2. Если я не ошибаюсь, ваш пример должен установить изображение по умолчанию, когда растровое изображение равно нулю! В этом примере вы не предоставляете это представлению, поэтому оно кэшируется. Шур это должно быть обработано каркасом, но это не так: (.

Пример кода:

public class DebtAdapter extends BaseAdapter {
...

    @Override
        public View getView(int position, View convertView, ViewGroup parent) 
        {
            ViewHolder holder;
            Bitmap bitmap;

            if(convertView == null)  
            {
                convertView = inflater.inflate(viewResourceId, null);

                holder = new ViewHolder();
                holder.photo = (ImageView) convertView.findViewById(R.id.photo);

                convertView.setTag(holder);
            }
            else 
            {
                holder = (ViewHolder) convertView.getTag();
            }
            bitmap = item.getContact().getPhoto();
            if(bitmap != null)
            {
                holder.photo.setImageBitmap(bitmap);
            }
            else
            {
                holder.photo.setImageBitmap(null);
            }
            return convertView;
        }
}

Надеюсь, это поможет.

0 голосов
/ 28 мая 2010

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

...