Android加载大图Bitmap发生OOM(Out Of Memmory Error)解决方案

简介: 本文作者:Zhang Phil原文链接: http://blog.csdn.net/zhangphil/article/details/48130053Android加载大图Bitmap发生OOM(Out ...
本文作者:Zhang Phil
原文链接:
http://blog.csdn.net/zhangphil/article/details/48130053



Android加载大图Bitmap发生OOM(Out Of Memmory Error)解决方案

Android的内存管理机制对Bitmap比较敏感,并且Android对Bitmap的操作是基于native方法,当在应用中加载过大的Bitmap时候,很容易造成Android OOM(Out Of Memmory) Error,进而导致整个APP崩溃,调试还十分困难。
Android OOM Error如图所示:



对于Android OOM解决方案有很多种,最简单、最便于实施的就是在加载过大Bitmap时候进行压缩,主要是通过设置BitmapFactory.Options的inSampleSize值进行压缩,假设inSampleSize=3,那么,就是说我告知BitmapFactory将原始图片资源缩小到原大小的三分之一。
Java代码所示:

public	static	Bitmap getBitmapNonOOM(Context context, int resId){
		
		BitmapFactory.Options options = new BitmapFactory.Options();
		
		//设置此参数后,将不会把图片载入内存不会分配内存,而只读取图片的基础信息如宽、高。
		//options.inJustDecodeBounds = true;
		
		//BitmapFactory.decodeResource(context.getResources(), resId, options);
		//int imageHeight = options.outHeight;
		//int imageWidth = options.outWidth;
	
		//将原图缩小3倍
		options.inSampleSize = 3;
		
		Bitmap bmp = BitmapFactory.decodeResource(context.getResources(), resId,options);
		
		return	bmp;
	}

正如上述代码中注释掉的那部分代码,

//设置此参数后,将不会把图片载入内存不会分配内存,而只读取图片的基础信息如宽、高。
		//options.inJustDecodeBounds = true;
		
		//BitmapFactory.decodeResource(context.getResources(), resId, options);
		//int imageHeight = options.outHeight;
		//int imageWidth = options.outWidth;


如果加载一个Android图片资源目的仅仅只是为了获取该图片资源的宽高等基础信息,那就没必要将这个图片载入内存,要知道,一旦载入内存,就要带来不小的性能开销,因此,可以对图片资源进行“预处理”,设置BitmapFactory.Options的参数:
options.inJustDecodeBounds = true;

告知BitmapFactory,不要将该图片载入内存,仅仅只需预处理然后返回该图片资源的基础信息如宽高等即可。


相关文章
|
15天前
|
Android开发
【Bug】Android resource linking failed和error: failed linking references.
【Bug】Android resource linking failed和error: failed linking references.
|
1月前
|
存储 缓存 编解码
Android 性能优化: 解释Bitmap的优化策略。
Android 性能优化: 解释Bitmap的优化策略。
25 1
|
2月前
|
XML Android开发 数据格式
[Android]Bitmap Drawable
[Android]Bitmap Drawable
21 0
|
2月前
|
XML 算法 Java
Android App开发之位图加工Bitmap中转换位图的像素色彩、裁剪内部区域、利用矩阵变换位图的讲解及实战(附源码和演示)
Android App开发之位图加工Bitmap中转换位图的像素色彩、裁剪内部区域、利用矩阵变换位图的讲解及实战(附源码和演示)
24 0
|
2月前
|
XML Java Android开发
Android Studio App开发中异步任务AsynTask与异步服务IntentService的讲解与实战(实现四大名著的加载进度条 附源码)
Android Studio App开发中异步任务AsynTask与异步服务IntentService的讲解与实战(实现四大名著的加载进度条 附源码)
20 0
|
4月前
|
API Android开发 数据安全/隐私保护
解决android webview 加载http url 失败 net::ERR_CLEARTEXT_NOT_PERMITTED 错误
解决android webview 加载http url 失败 net::ERR_CLEARTEXT_NOT_PERMITTED 错误
141 0
|
5月前
|
Android开发
Android Studio 控制台中文乱码,解决方案都在这里了,完美解决
Android Studio 控制台中文乱码,解决方案都在这里了,完美解决
|
5月前
|
Java 开发工具 Maven
Android 编译 gradle 内存 OOM 解决之路(二)
Android 编译 gradle 内存 OOM 解决之路
|
5月前
|
Java Android开发
Android 编译 gradle 内存 OOM 解决之路(一)
Android 编译 gradle 内存 OOM 解决之路
|
6月前
|
IDE Java 开发工具
Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8的解决方案
Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8的解决方案

相关产品

  • 云迁移中心