Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 位图大小超过VM预算java.lang.OutOfMemoryError:位图大小超过VM预算_Android - Fatal编程技术网

Android 位图大小超过VM预算java.lang.OutOfMemoryError:位图大小超过VM预算

Android 位图大小超过VM预算java.lang.OutOfMemoryError:位图大小超过VM预算,android,Android,我知道这个问题已经在这个论坛上被问过很多次了,但是我仍然不能得到解决这个问题的完美答案 在我的应用程序中,我使用了3种不同大小的相同图像:小、中、大 当我多次使用这些图像时,我得到了这个错误 08-24 11:08:55.994: E/ImageLoader(636): bitmap size exceeds VM budget 08-24 11:08:55.994: E/ImageLoader(636): java.lang.OutOfMemoryError: bitmap size exce

我知道这个问题已经在这个论坛上被问过很多次了,但是我仍然不能得到解决这个问题的完美答案

在我的应用程序中,我使用了3种不同大小的相同图像:小、中、大

当我多次使用这些图像时,我得到了这个错误

08-24 11:08:55.994: E/ImageLoader(636): bitmap size exceeds VM budget
08-24 11:08:55.994: E/ImageLoader(636): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
08-24 11:08:55.994: E/ImageLoader(636):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
08-24 11:08:55.994: E/ImageLoader(636):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:459)
08-24 11:08:55.994: E/ImageLoader(636):     at com.nostra13.universalimageloader.core.ImageDecoder.decode(ImageDecoder.java:75)
08-24 11:08:55.994: E/ImageLoader(636):     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeWithOOMHandling(LoadAndDisplayImageTask.java:161)
08-24 11:08:55.994: E/ImageLoader(636):     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:148)
08-24 11:08:55.994: E/ImageLoader(636):     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:104)
08-24 11:08:55.994: E/ImageLoader(636):     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:58)
08-24 11:08:55.994: E/ImageLoader(636):     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
08-24 11:08:55.994: E/ImageLoader(636):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
08-24 11:08:55.994: E/ImageLoader(636):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
08-24 11:08:55.994: E/ImageLoader(636):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
08-24 11:08:55.994: E/ImageLoader(636):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
08-24 11:08:55.994: E/ImageLoader(636):     at java.lang.Thread.run(Thread.java:1096)
有人能帮忙解决吗。。对于同一个问题,我已经搜索了很多,但仍然没有找到这样的解决方案

这就是为什么我必须在早上四点写这个问题

我在等待肯定的答复


谢谢。

这是图像的常见问题。Android为每个应用程序提供了一定的空间。照原样拍摄图像而不缩小尺寸时,往往会导致此问题。最好的解决办法是

BitmapFactory.Options=new-BitmapFactory.Options()

options.inSampleSize=8(此处使用值作为最佳解决方案的2次幂)

并在解码时将其传递给位图


Bitmap bm=BitmapFactory.decodeStream(,null,选项)

这是图像的常见问题。Android为每个应用程序提供了一定的空间。照原样拍摄图像而不缩小尺寸时,往往会导致此问题。最好的解决办法是

BitmapFactory.Options=new-BitmapFactory.Options()

options.inSampleSize=8(此处使用值作为最佳解决方案的2次幂)

并在解码时将其传递给位图


Bitmap bm=BitmapFactory.decodeStream(,null,选项)

我认为您可以使用失败重试机制来解决此问题

比如:尝试正常加载图像,如果失败,从catch块中,尝试使用BitmapConfig(Bitmap.Config.ARGB_4444)以较低的质量加载图像,如果再次失败,尝试以更低的质量加载图像(Bitmap.Config.ALPHA_8)。我也有同样的问题,现在这个方法适合我

Bitmap imageBitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inDither = false; 
options.inPurgeable = true;
options.inInputShareable = true; 
options.inTempStorage = new byte[32 * 1024];
options.inPreferredConfig = config;//Bitmap.Config.ARGB_4444 or Bitmap.Config.ALPHA_8 when failed  
options.inSampleSize = 1;
imageBitmap = BitmapFactory.decodeFile(bitmapPath, options);

我认为您可以使用失败重试机制来解决此问题

比如:尝试正常加载图像,如果失败,从catch块中,尝试使用BitmapConfig(Bitmap.Config.ARGB_4444)以较低的质量加载图像,如果再次失败,尝试以更低的质量加载图像(Bitmap.Config.ALPHA_8)。我也有同样的问题,现在这个方法适合我

Bitmap imageBitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inDither = false; 
options.inPurgeable = true;
options.inInputShareable = true; 
options.inTempStorage = new byte[32 * 1024];
options.inPreferredConfig = config;//Bitmap.Config.ARGB_4444 or Bitmap.Config.ALPHA_8 when failed  
options.inSampleSize = 1;
imageBitmap = BitmapFactory.decodeFile(bitmapPath, options);

您可以使用此方法解码位图:

public static Bitmap loadBitmap() {
    FileInputStream fis = null;
    Bitmap bitmap = null;

    BitmapFactory.Options option = new BitmapFactory.Options();
    option.inDither = false;
    option.inPurgeable = true;
    option.inInputShareable = true;
    option.inTempStorage = new byte[32 * 1024];
    option.inPreferredConfig = Bitmap.Config.RGB_565;

    try {
        fis = IOHelper.openInputStream(); //get the picture's FileInputStream
        FileDescriptor fd = fis.getFD();
        bitmap = BitmapFactory.decodeFileDescriptor(fd, null, option);
    } catch (IOException e) {

    } finally {
        IOHelper.closeQuietly(fis);
    }
    return bitmap;
}

您可以使用此方法解码位图:

public static Bitmap loadBitmap() {
    FileInputStream fis = null;
    Bitmap bitmap = null;

    BitmapFactory.Options option = new BitmapFactory.Options();
    option.inDither = false;
    option.inPurgeable = true;
    option.inInputShareable = true;
    option.inTempStorage = new byte[32 * 1024];
    option.inPreferredConfig = Bitmap.Config.RGB_565;

    try {
        fis = IOHelper.openInputStream(); //get the picture's FileInputStream
        FileDescriptor fd = fis.getFD();
        bitmap = BitmapFactory.decodeFileDescriptor(fd, null, option);
    } catch (IOException e) {

    } finally {
        IOHelper.closeQuietly(fis);
    }
    return bitmap;
}
这意味着设备内存不足,正在强制关闭

现在,既然您说当您多次使用图像时会出现错误,我相信您并没有释放资源。位图有时会占用大量空间,如果您将位图持久保存在内存中,那么如果设备出现问题,我也不会感到惊讶。不同的设备有不同的内存规格,运行几次后,内存就会被填满

因此,我的建议是清除位图和其他用于临时目的的存储

如果这仍然不能解决您的问题,请将代码张贴在您处理图像的位置,我们将尝试看看是否有一种更节省内存的方法来处理您正在做的事情

祝你好运

这意味着设备内存不足,正在强制关闭

现在,既然您说当您多次使用图像时会出现错误,我相信您并没有释放资源。位图有时会占用大量空间,如果您将位图持久保存在内存中,那么如果设备出现问题,我也不会感到惊讶。不同的设备有不同的内存规格,运行几次后,内存就会被填满

因此,我的建议是清除位图和其他用于临时目的的存储

如果这仍然不能解决您的问题,请将代码张贴在您处理图像的位置,我们将尝试看看是否有一种更节省内存的方法来处理您正在做的事情


祝你好运

这是一个老问题,但我已经浪费了一整天的时间试图用优秀的UIL修复旧设备上的图像内存问题。这些答案都不是UIL所特有的,我的解决方案最终来自于对Nostra自己回答的这个问题的磕磕绊绊:


最大内存缓存宽度和高度值对我来说非常重要。我下载并显示了一个大致与屏幕大小相同的图像,并将其放置在屏幕宽度和高度相同的图像视图中,因此实际上没有进行任何缩放。这对我的2.3手机来说太大了,将尺寸减半在很大程度上解决了一点明显的图像退化问题。

这是一个老问题,但我已经浪费了一整天的时间,试图用优秀的UIL修复旧设备上的图像存储问题。这些答案都不是UIL所特有的,我的解决方案最终来自于对Nostra自己回答的这个问题的磕磕绊绊:


最大内存缓存宽度和高度值对我来说非常重要。我下载并显示了一个大致与屏幕大小相同的图像,并将其放置在屏幕宽度和高度相同的图像视图中,因此实际上没有进行任何缩放。这对我的2.3手机来说太大了,将尺寸对半有助于减少明显的图像退化。

你能提供一些代码吗?您已经尝试过图像缓存/加载的确切逻辑吗?实际上,我正在使用universal-image-loader-1.5.4.jar文件进行图像加载。请阅读Android开发者关于如何处理位图的培训。您是否每次使用时都为图像重新创建位图?还是只分配一次并重用它们?如果是前一个,是否调用了bitmap.recycle()?.memoryCache(新的WeakMemoryCache())在配置ImageLoaderConfiguration时使用此选项