如何避免在Android中使用位图时出现内存不足错误

我正在使用位图。 代码运行时,显示内存不足错误。 如何避免错误。 我的代码如下。 提前致谢。

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); } } 

Related of "如何避免在Android中使用位图时出现内存不足错误"

当你完成你的位图,意味着当你的位图完成其工作,然后使其recyle和null如下所示:

 bitmap.recycle(); bitmap=null; 

要么

我想你是从url下载图片,所以我build议你使用Android查询,如果你使用它,你将永远不会得到这个错误。

您可以从这里下载jar文件: http : //code.google.com/p/android-query/downloads/list下载jar文件并将jar设置为您的构buildpath。

  AQuery androidAQuery=new AQuery(this); 

作为直接从url加载图片的例子:

 androidAQuery.id(YOUR IMAGEVIEW).image(YOUR IMAGE TO LOAD, true, true, getDeviceWidth(), ANY DEFAULT IMAGE YOU WANT TO SHOW); 

作为从url获取位图的例子:

 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. } }); 

这是非常快速和准确的,使用这个你可以find更多的function,如animation时加载; 获得一个位图,如果需要的话; 等等

现在仍然是你的图像尺寸大,为什么使用这样的宽度和高度,并设置图像清除后的chache

 Bitmap myBitmap = Image.decodeSampledBitmapFromUri(path, 60, 60); img_cook[index].setImageBitmap(myBitmap); if (myBitmap != null) { bitmap.recycle(); bitmap = null; System.gc(); } 

我猜你创build你的第一个位图后,你没有得到OOMexception,而是,这是发生在你加载到内存中的几个位图后?

尝试通过在不再需要的位图上手动调用recycle()来提高效率。 当GC收集一些已经释放所有引用的Bitmaps数据时,图像的实际内存被存储在本地内存中,因此当需要释放内存时,需要调用bitmap.recycle()来释放内存。

希望这可以帮助。

Android应用程序的内存量非常低。 您应该仔细pipe理以避免内存不足exception。 你可以看到Google的解决scheme