Android Bitmap OutOfMemory 解决办法
Android Bitmap OutOfMemory 解决办法
置顶 2014年07月01日 14:41:22 阅读数:3072 标签: OutOfMemoryBitmapandroid图片优化更多
个人分类: 异常问题和解决办法
在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.及时回收内存
-
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部分做一些内存回收操作,或者是使用缓存图片等...
总是良好的编程风格和优质的代码结构是程序员的无上追求....
https://blog.csdn.net/tangnengwu/article/details/36185361
https://blog.csdn.net/zhuwentao2150/article/details/52097344
上一篇: 记录一次因导出导致的生产事故
下一篇: java实现Excel多版本读取
推荐阅读
-
android Bitmap圆角与倒影的具体实现代码
-
android通过bitmap生成新图片关键性代码
-
Android getBackground().setAlpha遇到问题解决办法
-
Android 实现把bitmap图片的某一部分的颜色改成其他颜色
-
Android 软键盘出现不适应的解决办法总结
-
Android DaggerActivityComponent错误解决办法详解
-
Eclipse启动失败Android sdk content loader 0%的四种解决办法
-
新手使用Android Studio会遇到的两个问题和解决办法
-
Android下修改SeekBar样式的解决办法
-
Android ExpandableListView长按事件的完美解决办法