我的应用程序的主要目的是在显示以下方式的图像如图图像
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)
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 。 图像的延迟加载。
两者都使用缓存。
需要注意的是下面的代码可能会导致异常是很重要的:
Bitmap bitmap = Bitmap.createScaledBitmap(oldBitmap, newWidth, newHeight, true);
oldBitmap.recycle();
正确的是:
Bitmap bitmap = Bitmap.createScaledBitmap(oldBitmap, newWidth, newHeight, true);
if (oldBitmap!= bitmap){
oldBitmap.recycle();
}
因为文件说:
如果指定的宽度和高度是相同的当前宽度与源btimap的高度,源位图被返回并且现在被创建新的位图。
您试图访问更多的内存,那么你必须。 尝试使用
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