如何在Android中清除缓存的图像?

时间:2010-05-28 13:18:21

标签: android listview caching android-lazyadapter

如何在Android中以编程方式从内存中清除缓存的图像?

当我滚动重新加载图片时,我有一个带有图标的ListView。所以它产生OutofMemoryError。我希望在获得此异常时清除缓存。怎么做?有什么帮助吗?

编辑:

我只是在我的程序中使用此代码来加载图像: http://ballardhack.wordpress.com/2010/04/10/loading-images-over-http-on-a-separate-thread-on-android/

3 个答案:

答案 0 :(得分:2)

您是否正在重复使用ListView中的位图对象?

Romain Guy去年在Google I / O的Android talk on layouts and views中谈到了这对记忆和流畅表现的重要性。

基本上,你应该有一定数量的位图对象(他使用8),每次你滚动时加载下一个图像,它应该进入刚刚消失的对象。

您可能认为缓存图像的速度更快,但它会导致内存问题和垃圾收集问题,这些问题不可避免地会导致延迟。

答案 1 :(得分:2)

Yup ...已知“问题”,让我们说这是ListView的行为。

如何修复它:

  1. 按照@HXCaine的建议观看视频的前15分钟,其中解释了ViewHolder。

  2. 如果我没弄错,你的例子应该在位图为空时设置默认图像!在示例中,您不会将其提供给视图,因此它会被缓存。 Shur这应该由框架处理,但它不是:(。

  3. 示例代码:

    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;
            }
    }
    

    我希望它有所帮助。

答案 2 :(得分:0)

如果您使用的是Bitmap,则可以通过调用recycle method释放一些内存。但是,我不确定这是否能解决您的问题。