Android ImageAdapter和ListView(java.lang.OutOfMemoryError:位图大小超出VM预算)

Android ImageAdapter和ListView(java.lang.OutOfMemoryError:位图大小超出VM预算),android,out-of-memory,Android,Out Of Memory,我使用ListView显示通过ImageAdapter类提供的图像。 它在我的设备上(以及在我测试过的许多其他设备上)工作得很好,但不知怎的,当我使用模拟器时,我长按向上/向下按钮——10-15秒后,我会出现outOfMemory错误 我试图清除缓存,取消缓存,等等-没有任何帮助 我知道这种崩溃非常罕见(我无法在任何“真实”设备上复制),但我可以在DDMS上看到,“GC释放”在长时间的按压过程中变得越来越大,我无法找到清除它们的方法 感谢您的帮助,Tnx。您应该使用inSampleSize选项进

我使用ListView显示通过ImageAdapter类提供的图像。 它在我的设备上(以及在我测试过的许多其他设备上)工作得很好,但不知怎的,当我使用模拟器时,我长按向上/向下按钮——10-15秒后,我会出现outOfMemory错误

我试图清除缓存,取消缓存,等等-没有任何帮助

我知道这种崩溃非常罕见(我无法在任何“真实”设备上复制),但我可以在DDMS上看到,“GC释放”在长时间的按压过程中变得越来越大,我无法找到清除它们的方法


感谢您的帮助,Tnx。

您应该使用inSampleSize选项进行解码,以减少内存消耗

另一个选项inJustDecodeBounds可以帮助您找到正确的inSampleSize值


<>你也应该考虑使用不可清洗的选项。它允许系统释放内存以避免内存不足。

我的ListView中也有同样的问题。正如Fedor所描述的,我能够通过适当地缩放图像和使用Inpurgable来减少下载的内存占用。请参见此处的代码:

我几分钟前刚刚遇到这个问题。通过更好地管理我的listview适配器,我解决了这个问题。我认为这是我使用的数百张50x50px图像的问题,结果是每次显示行时我都试图放大我的自定义视图。通过测试行是否膨胀,我消除了这个错误,并且使用了数百个位图。这实际上是针对微调器的,但对于ListView,基本适配器的工作原理是相同的。这个简单的修复也大大提高了适配器的性能

@Override
public View getView(final int position, View convertView, final ViewGroup parent) {

    if(convertView == null){
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.spinner_row, null);
    }
...