我正在使用位图。当代码运行时,它显示内存不足错误。如何避免错误。我的代码如下。提前谢谢。
Bitmap myBitmap = Image.decodeSampledBitmapFromUri(path, 250, 500);
img_cook[index].setImageBitmap(myBitmap);
public static Bitmap decodeSampledBitmapFromUr(String path, int reqWidth,
int reqHeight) {
Bitmap bm = null;
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
bm = BitmapFactory.decodeFile(path, options);
return bm;
}
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
if (width > height) {
inSampleSize = Math.round((float)height / (float)reqHeight);
} else {
inSampleSize = Math.round((float)width / (float)reqWidth);
}
}
答案 0 :(得分:8)
完成Bitmap后,意味着当Bitmap完成其工作,然后将其设置为recyle和null,如下所示:
bitmap.recycle();
bitmap=null;
OR
我认为你是从url下载Image,所以我建议你使用Android Query,如果你使用它,你永远不会得到这个错误。
您可以从此处下载jar文件: http://code.google.com/p/android-query/downloads/list 下载jar文件并将jar设置为Build Path。
AQuery androidAQuery=new AQuery(this);
作为直接从网址加载图片的示例:
androidAQuery.id(YOUR IMAGEVIEW).image(YOUR IMAGE TO LOAD, true, true, getDeviceWidth(), ANY DEFAULT IMAGE YOU WANT TO SHOW);
作为从url获取Bitmap的示例:
androidAQuery.ajax(YOUR IMAGE URL,Bitmap.class,0,new AjaxCallback<Bitmap>(){
@Override
public void callback(String url, Bitmap object, AjaxStatus status) {
super.callback(url, object, status);
//You will get Bitmap from object.
}
});
它非常快速和准确,使用它你可以在加载时找到更多功能,如动画;如果需要,获取位图;等
答案 1 :(得分:1)
现在你的图像尺寸很大,为什么要使用这样的宽度和高度,并在设置图像后清除chache
Bitmap myBitmap = Image.decodeSampledBitmapFromUri(path, 60, 60);
img_cook[index].setImageBitmap(myBitmap);
if (myBitmap != null)
{
bitmap.recycle();
bitmap = null;
System.gc();
}
答案 2 :(得分:0)
我猜你在创建第一个位图后没有得到OOM异常,而是在你将多个位图加载到内存后会发生这种情况?
尝试通过在不再需要的位图上手动调用recycle()来提高效率。当GC收集一些其所有引用都已释放的Bitmaps数据时,图像的实际内存存储在本机内存中,因此需要调用bitmap.recycle()以在需要释放时释放该内存
希望这会有所帮助。
答案 3 :(得分:0)
Android应用程序的内存量非常低。您应该仔细管理它以避免内存不足异常。你可以看到 Google's Solution