如何在Android中以编程方式从内存中清除缓存的图像?
当我滚动重新加载图片时,我有一个带有图标的ListView
。所以它产生OutofMemoryError
。我希望在获得此异常时清除缓存。怎么做?有什么帮助吗?
我只是在我的程序中使用此代码来加载图像: http://ballardhack.wordpress.com/2010/04/10/loading-images-over-http-on-a-separate-thread-on-android/
答案 0 :(得分:2)
您是否正在重复使用ListView中的位图对象?
Romain Guy去年在Google I / O的Android talk on layouts and views中谈到了这对记忆和流畅表现的重要性。
基本上,你应该有一定数量的位图对象(他使用8),每次你滚动时加载下一个图像,它应该进入刚刚消失的对象。
您可能认为缓存图像的速度更快,但它会导致内存问题和垃圾收集问题,这些问题不可避免地会导致延迟。
答案 1 :(得分:2)
Yup ...已知“问题”,让我们说这是ListView的行为。
如何修复它:
按照@HXCaine的建议观看视频的前15分钟,其中解释了ViewHolder。
如果我没弄错,你的例子应该在位图为空时设置默认图像!在示例中,您不会将其提供给视图,因此它会被缓存。 Shur这应该由框架处理,但它不是:(。
示例代码:
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释放一些内存。但是,我不确定这是否能解决您的问题。