0

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

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

编辑:

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

4

3 回答 3

2

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

Romain Guy在去年 Google I/O 上关于布局和视图的 Android 演讲中谈到了这对于内存和流畅性能的重要性。

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

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

于 2010-05-28T22:48:56.297 回答
2

是的...已知的“问题”,假设这是 ListView 的行为。

如何修复它:

  1. 按照@HXCaine 的建议观看视频的前 15 分钟,其中解释了 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;
        }
}

我希望它有所帮助。

于 2010-10-18T12:16:45.817 回答
0

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

于 2010-05-28T13:24:15.510 回答