Android的Bitmap.createScaledBitmap抛出java.lang.OutOf

2019-07-22 10:11发布

我的应用程序的主要目的是在显示以下方式的图像如图图像

private void setSelectedImage(int selectedImagePosition) 
{

    BitmapDrawable bd = (BitmapDrawable) drawables.get(selectedImagePosition);
    Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(), (int) (bd.getIntrinsicHeight() * 0.9), (int) (bd.getIntrinsicWidth() * 0.7), false);
    selectedImageView.setImageBitmap(b);
    selectedImageView.setScaleType(ScaleType.FIT_XY);

}

详细代码,可以发现这里

例外是在下面的行抛出

Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(), (int) (bd.getIntrinsicHeight() * 0.9), (int) (bd.getIntrinsicWidth() * 0.7), false);

上述功能是从所谓的onItemSelected 。 **这个应用程序依然很不错的2.2和2.3,但立即引发在4.1以上异常代码工作正常,但会引发以下异常。 我因此未看到任何崩溃的2.2和2.3,但它在4.1 immedidately崩溃是否有内存管理的糖豆任何重大的区别? **:

java.lang.OutOfMemoryError
AndroidRuntime(2616):   at android.graphics.Bitmap.nativeCreate(Native Method)
AndroidRuntime(2616):   at android.graphics.Bitmap.createBitmap(Bitmap.java:640)
AndroidRuntime(2616):   at android.graphics.Bitmap.createBitmap(Bitmap.java:586) 
AndroidRuntime(2616):   at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:466)
AndroidRuntime(2616):   at com.rdx.gallery.GalleryDemoActivity.setSelectedImage(GalleryDemoActivity.java:183)

Answer 1:

http://www.youtube.com/watch?v=_CruQY55HOk 。 Andorid的3.0位图后的像素数据被存储在堆上。 您似乎超过堆内存的大小。 仅仅因为你的应用程序需要大量堆不使用大堆。 堆更多的大小,更经常的垃圾收集。 视频对主题一个很好的解释。

在不使用时,也应回收的位图。 上堆的垃圾收集完成我的标记和清除,所以当你回收位图是免费的内存。 所以堆大小不会增长和耗尽内存。

 bitmap.recycle();

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html 。 在加载文档有效的位图。 看一看装载在内存缩小版。

除了形成这个,你可以使用通用图像装载机。 https://github.com/nostra13/Android-Universal-Image-Loader 。

https://github.com/thest1/LazyList 。 图像的延迟加载。

两者都使用缓存。



Answer 2:

需要注意的是下面的代码可能会导致异常是很重要的:

Bitmap bitmap = Bitmap.createScaledBitmap(oldBitmap, newWidth, newHeight, true); 
oldBitmap.recycle();

正确的是:

Bitmap bitmap = Bitmap.createScaledBitmap(oldBitmap, newWidth, newHeight, true); 
if (oldBitmap!= bitmap){
     oldBitmap.recycle();
}

因为文件说:

如果指定的宽度和高度是相同的当前宽度与源btimap的高度,源位图被返回并且现在被创建新的位图。



Answer 3:

您试图访问更多的内存,那么你必须。 尝试使用

 BitmapFactory.Options opts=new BitmapFactory.Options();
        opts.inDither=false;                    
        opts.inSampleSize = 8;                   
        opts.inPurgeable=true;                 
        opts.inInputShareable=true;             
        opts.inTempStorage=new byte[16 * 1024]; 

Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h1)
        , 65,65, true),

另外,也要看看下面的链接,以增加内存

http://developer.android.com/reference/android/R.styleable.html#AndroidManifestApplication_largeHeap

检测Android应用程序堆大小

编辑1

尝试使用nostras图片下载,你可以用它来显示本地存储的图像。 它管理内存非常好...

https://github.com/nostra13/Android-Universal-Image-Loader



文章来源: Android Bitmap.createScaledBitmap throws java.lang.OutOfMemoryError mostly on Jelly Bean 4.1