Android Bitmap.createScaledBitmap主要在Jelly Bean 4.1上抛出java.lang.OutOfMemoryError

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

在这里输入图像说明

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

详细的代码可以在这里find

在下面的行抛出exception

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

上面的函数是从onItemSelected 。 **该应用程序仍然在2.2和2.3上运行良好,但在4.1上立即抛出exception上面的代码工作正常,但抛出以下exception。 我在2.2和2.3中没有看到任何崩溃,但它在4.1中崩溃了。果冻豆的内存pipe理有什么主要区别吗? **:

 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) 

Solutions Collecting From Web of "Android Bitmap.createScaledBitmap主要在Jelly Bean 4.1上抛出java.lang.OutOfMemoryError"

http://www.youtube.com/watch?v=_CruQY55HOk 。 在andorid 3.0位图像素数据存储在堆上。 看来你超过了堆内存的大小。 只是因为你的应用程序需要大堆不要使用大堆。 更多堆的大小,更经常的垃圾收集。 该video对这个话题有很好的解释。

还可以在不使用时回收位图。 堆上的垃圾收集完成了我的标记和扫描,因此当您回收位图时,它会释放内存。 所以你的堆大小不会增长,并且会耗尽内存。

  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 。 延迟加载图像。

两者都使用caching。

请注意以下代码可能会导致exception:

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

适当的是:

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

因为文档说:

如果指定的宽度和高度与源btimap的当前宽度和高度相同,则返回源位图,现在创build新的位图。

你正在尝试访问更多的内存,然后你有。 尝试使用

  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图片下载器,您可以使用它在本地存储中显示图像。 它pipe理的内存非常好…

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