Android Bitmap OutOfMemory 解决的方法
2015-12-17 19:53
435 查看
在Android应用里,最耗费内存的就是图片资源。并且在Android系统中。读取位图Bitmap时,分给虚拟机中的图片的堆栈大小仅仅有8M。假设超出了。就会出现OutOfMemory异常
E/AndroidRuntime( 697): java.lang.OutOfMemoryError
E/AndroidRuntime( 697): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
E/AndroidRuntime( 697): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:500)
E/AndroidRuntime( 697): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:353)
E/AndroidRuntime( 697): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:376)
E/AndroidRuntime( 697): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:406)
E/AndroidRuntime( 697): at com.example.imagetoshow2.ImageAdapter.createReflectedImages(ImageAdapter.java:66)
E/AndroidRuntime( 697): at com.example.imagetoshow2.ImageAdapter.getView(ImageAdapter.java:54)
E/AndroidRuntime( 697): at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:193)
解决的方法:
1.及时回收内存
2.使用BitmapFactory.Options对图片进行压缩
使用inSampleSize设置放缩比例,默认值为0,设置一个大于0的数便可对图片进行压缩。
使inJustDecodeBounds为true后,再使用decodeFile()等方法,并不会真正的分配空间,即解码出来的Bitmap为null。仅仅会计算出options.outWidth和options.outHeight值。在下次使用BitmapFactory的decodeFile()等方法实例化Bitmap对象前。将opts.inJustDecodeBound设置回false就能够得到图片了。
3.代码优化
为了避免应用在分配Bitmap内存的时候出现OutOfMemory异常停止执行。通常。在实例化Bitmap的代码中,对OutOfMemory异常进行捕获
总是良好的编程风格和优质的代码结构是程序猿的无上追求....
E/AndroidRuntime( 697): java.lang.OutOfMemoryError
E/AndroidRuntime( 697): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
E/AndroidRuntime( 697): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:500)
E/AndroidRuntime( 697): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:353)
E/AndroidRuntime( 697): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:376)
E/AndroidRuntime( 697): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:406)
E/AndroidRuntime( 697): at com.example.imagetoshow2.ImageAdapter.createReflectedImages(ImageAdapter.java:66)
E/AndroidRuntime( 697): at com.example.imagetoshow2.ImageAdapter.getView(ImageAdapter.java:54)
E/AndroidRuntime( 697): at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:193)
解决的方法:
1.及时回收内存
if(bitmap != null && !bitmap.isRecycled()){ // 回收而且置为null bitmap.recycle(); bitmap = null; } System.gc();在适当的地方使用上述代码,将临时不需使用的的回收掉。当然system.gc不应该频繁调用,否则会使系统效率减少。
2.使用BitmapFactory.Options对图片进行压缩
BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inSampleSize = n; bitmap = BitmapFactory.decodeStream(fis, null, opts);
使用inSampleSize设置放缩比例,默认值为0,设置一个大于0的数便可对图片进行压缩。
BitmapFactory.Options opts = new BitmapFactory.Options(); // 设置inJustDecodeBounds为true opts.inJustDecodeBounds = true; // 使用decodeFile方法得到图片的宽和高 BitmapFactory.decodeFile(path, opts);
使inJustDecodeBounds为true后,再使用decodeFile()等方法,并不会真正的分配空间,即解码出来的Bitmap为null。仅仅会计算出options.outWidth和options.outHeight值。在下次使用BitmapFactory的decodeFile()等方法实例化Bitmap对象前。将opts.inJustDecodeBound设置回false就能够得到图片了。
3.代码优化
为了避免应用在分配Bitmap内存的时候出现OutOfMemory异常停止执行。通常。在实例化Bitmap的代码中,对OutOfMemory异常进行捕获
<span style="font-size:18px;"> <span style="font-size:18px;">Bitmap bitmap = null; try { // 实例化Bitmap bitmap = BitmapFactory.decodeFile(path); } catch (OutOfMemoryError e) { // }</span></span>然后在Catch部分做一些内存回收操作。或者是使用缓存图片等...
总是良好的编程风格和优质的代码结构是程序猿的无上追求....
相关文章推荐
- Android的图片压缩类ThumbnailUtils
- Android-->RxJava/RxAndroid 入门初体验
- Android进阶:PopupWindow详解
- android_rpg 天龙群侠传
- Android捕获异常处理——UncaughtExceptionHandler
- Android zxing 解析二维码,生成二维码极简demo
- Intent详细介绍及使用实例
- android propertyAnimator--()
- zhu的工作日记:handler消息处理机制浅解(android)
- Android中的asset文件夹和raw文件夹区别
- Android笔记(3)---Intent之间的传值
- Android 自定义ViewPager设置屏蔽左右滑动事件
- 如何锁定Android系统CPU的频率
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- Android
- 权限大全
- Android手机加密进度
- Android多屏幕适配资源生成
- android 动画之 属性动画propertyAnimator(一)
- 生产实习(Android)一