【问题标题】:Custom GridView causes out of memory error while loading lots of images加载大量图像时自定义 GridView 导致内存不足错误
【发布时间】:2013-06-24 07:24:57
【问题描述】:
我有一个 gridview 的自定义布局。每个原始的 gridview 都包含一个进度条、两个图像视图和两个文本视图。图像大小是缩略图大小。虽然我必须加载大量位图,例如:- 500 张图像,这会导致内存不足错误。图像是第一次从 Internet 加载,然后存储在 SD 卡中,下次加载从 SD 卡加载的 gridview 时。如何克服这个问题。如果gridview被单个imageview膨胀,我已经找到了很多解决内存不足的问题。请建议我如何在使用自定义布局时克服此问题。如果您知道任何示例项目在 gridview 中处理此内存不足错误,同时在 gridview 中膨胀自定义布局,请告诉我。
【问题讨论】:
标签:
android
gridview
out-of-memory
【解决方案1】:
最好创建一个扩展 Application 的类。这
应用程序类会在任何时候给你 onlowmemory() 回调
应用程序内存不足。在那里你可以写
public void onLowmemory() {
Runtime.getRuntime().gc(); }
这将调用系统 GC 方法。执行垃圾收集器时
android 将垃圾所有未使用的对象。
还有另一种方法可以解决这个问题。在动画中你可以调用
Runtime.getRuntime().gc();调用垃圾收集器。也在
活动 onDestroy() 方法你可以调用 Runtime.getRuntime().gc();
这样你的问题就解决了
【解决方案2】:
我也面临同样的问题。
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);
}
}
我用这个函数来解码位图,bounds = grid size。
这解决了大部分问题。
对于非常低端的设备,添加 try{} catch (OutOfMemoryError e){} ...
【解决方案3】:
尝试在图像中为 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);
在您的图像视图中设置此位图
【解决方案4】:
使用此代码解决内存不足异常问题
Bitmap bitmap = BitmapFactory.decodeStream(is);
if (bitmap != null) {
Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 100, 100, true);
imageView = new ImageView(mContext);
imageView.setImageBitmap(resizedBitmap);
}