自定义GridView在加载大量图像时导致内存不足错误

时间:2013-06-24 07:24:57

标签: android gridview out-of-memory

我有一个gridview的自定义布局。 gridview的每个原始包含一个进度条,两个图像视图和两个文本视图。图像大小是缩略图大小。虽然我必须加载大量的位图,例如: - 500张图像,这会导致内存不足错误。图像首次从Internet加载,然后存储在SD卡中,下次加载从SD卡加载的gridview时。如何克服这个问题。如果gridview用单个imageview充气,我找到了许多克服内存不足的答案。请建议我在使用自定义布局时如何克服这个问题。让我知道,如果你知道在gridview中膨胀自定义布局时在gridview中处理这种内存不足错误的任何示例项目。

4 个答案:

答案 0 :(得分:2)

  

最好创建一个扩展Application的类。这个   应用程序类每次都会给你onlowmemory()回调   应用程序内存不足。在那里你可以写

     

public void onLowmemory(){

     。

调用Runtime.getRuntime()GC(); }

     

将调用系统GC方法。执行垃圾收集器   android将垃圾所有未使用的对象。

     

还有另一种方法可以解决这个问题。在动画中你可以打电话   调用Runtime.getRuntime()GC();调用垃圾收集器。也在   activity onDestroy()方法你可以调用Runtime.getRuntime()。gc();

     

所以你的问题将得到解决

答案 1 :(得分:0)

在gridview out of memory

的图片中尝试此代码集
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 8;//you set size qulity for image(2,3,,4,5,6,7,8 etc..) 
Bitmap preview_bitmap=BitmapFactory.decodeStream(is,null,options);

在imageview中设置此位图

答案 2 :(得分:0)

我面临同样的问题。 OutOfMemoryError通常由。引起 第一种方法是

BitmapFactory.decodeFile(srcImg);

由于图像在显示之前被转换为位图,因此许多大位图通常会导致错误。

为了解决这个问题,我添加了以下功能

public static Bitmap decodeWithBounds(String srcImg, int bounds) {
    if (bounds > 0){
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(srcImg, options);

        if (options.outHeight > bounds || options.outWidth > bounds){
            options.inSampleSize = Math.max(options.outHeight/bounds, options.outWidth/bounds);
        }
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(srcImg, options);
    } else {
        return BitmapFactory.decodeFile(srcImg);
    }
}

我使用此函数解码位图,边界=网格大小。

这解决了大部分问题。

对于非常低端的设备,添加try {} catch(OutOfMemoryError e){} ...

答案 3 :(得分:0)

使用此代码解决内存不足异常问题

Bitmap bitmap = BitmapFactory.decodeStream(is);
if (bitmap != null) {
    Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 100, 100, true);
    imageView = new ImageView(mContext);
    imageView.setImageBitmap(resizedBitmap);
}