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

如何在Android中清除缓存的图像?,android,listview,caching,android-lazyadapter,Android,Listview,Caching,Android Lazyadapter,如何在Android中以编程方式清除内存中的缓存图像 我有一个列表视图,当我滚动它时,它会重新加载图像。因此它会产生OutofMemoryError。我希望在获取此异常时清除缓存。怎么做?有什么帮助吗 编辑: 我只是在我的程序中使用以下代码来加载图像: 如果使用位图,可以通过调用释放一些内存。但是,我不确定这是否能解决您的问题。如果使用位图,可以通过调用释放一些内存。但是,我不确定这是否能解决您的问题。您是否正在使用ListView中的位图对象 罗曼·盖伊(Romain Guy)去年在谷歌I/O

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

我有一个
列表视图
,当我滚动它时,它会重新加载图像。因此它会产生
OutofMemoryError
。我希望在获取此异常时清除缓存。怎么做?有什么帮助吗

编辑: 我只是在我的程序中使用以下代码来加载图像:

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

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

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

罗曼·盖伊(Romain Guy)去年在谷歌I/O大会上谈到了这对内存和流畅性能的重要性

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


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

您正在使用ListView中的位图对象吗

罗曼·盖伊(Romain Guy)去年在谷歌I/O大会上谈到了这对内存和流畅性能的重要性

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

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

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

如何修复它:

  • 按照@HXCaine的建议观看视频的前15分钟,这解释了视窗持有人

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

  • 示例代码:

    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;
            }
    }
    
    我希望它能有所帮助。

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

    如何修复它:

  • 按照@HXCaine的建议观看视频的前15分钟,这解释了视窗持有人

  • 如果我没有弄错的话,您的示例应该在位图为空时设置默认图像!在示例中,您没有将其提供给视图,因此它会被缓存。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;
            }
    }
    

    我希望这会有帮助。

    你能发布代码吗?让我们看看为什么会出现内存错误。你能发布代码吗?让我们看看为什么会出现内存错误。不确定重新使用位图对象是什么意思。你是指重新使用列表项的视图(即使用转换视图)?.因为我看不到在那次谈话中提到重新使用实际的位图对象来改进preform:可能我错了,但想法是回收对象以防止GC重复进行收集并降低性能不确定重新使用位图对象的意思..你是指重新使用列表项的视图吗(即使用转换视图)?.因为我看不到在那次谈话中提到重新使用实际的位图对象来改进preform:可能我错了,但想法是循环使用对象以防止GC重复进行收集并降低性能。注意:我使用了一个返回位图对象的虚拟项变量。注意:alos我使用了一个虚拟项v返回位图对象的变量。对于通过SoftReference清除的位图,您将如何调用.recycle(),我认为您不能?对于通过SoftReference清除的位图,您将如何调用.recycle(),我认为您不能?