7

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

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

4 回答 4

8

当你完成了你的位图,意味着当你的位图完成它的工作时,让它 recyle 和 null 如下所示:

bitmap.recycle();
bitmap=null;

或者

我认为您正在从 url 下载图像,所以我建议您为此使用 Android Query,如果您使用它,您将永远不会收到此错误。

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

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

它非常快速和准确,使用它您可以在加载时找到更多功能,例如动画;如果需要,获取位图;等等

于 2013-10-03T06:58:48.267 回答
1

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

Bitmap myBitmap = Image.decodeSampledBitmapFromUri(path, 60, 60);
  img_cook[index].setImageBitmap(myBitmap);  
  if (myBitmap != null)
   {
     bitmap.recycle();
     bitmap = null;
     System.gc();
   }
于 2013-10-03T05:56:10.487 回答
0

我猜您在创建第一个位图后没有收到 OOM 异常,而是在您将多个位图加载到内存后发生这种情况?

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

希望这可以帮助。

于 2013-10-03T05:56:09.907 回答
0

Android 应用程序的内存量非常低。您应该小心管理它以避免内存不足异常。你可以看到 谷歌的解决方案

于 2015-07-12T01:17:43.473 回答