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