Android一分钟了解OOM

原创 2015年11月18日 19:59:42

Android 图片加载经常出现内存OOM异常,处理起来也很复杂,主要是图片分辨率过大(如:2880*1620),但是基本原理大概如下:

public static Bitmap oomSolution(Resources res,int resID,int widthpx,int heightpx){
		Options options =new BitmapFactory.Options();
		options.inJustDecodeBounds=true;//不在内存中读取图片
		options.inPreferredConfig = Bitmap.Config.RGB_565;//代表RGB位图
		BitmapFactory.decodeResource(res,resID, options);//压缩前图片
		int width= options.outWidth;//原始图片宽
		int height=options.outHeight;//原始图片高
		if(height>heightpx||width>widthpx){
			int inheight=Math.round((float)height/(float)heightpx);
			int inwidth=Math.round((float)width/(float)widthpx);
			int inSize=inheight>inwidth?inheight:inwidth;
			options.inSampleSize=inSize;//缩放值:1不缩放 2为缩放1/2
		}
		options.inJustDecodeBounds=false;//在内存中创建图片
		Bitmap bm = BitmapFactory.decodeResource(res,resID, options);//压缩后的图片
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bm.compress(Bitmap.CompressFormat.PNG,100, baos);//压缩图片
		return bm;
	}
来源:http://blog.csdn.net/a704755096/article/details/49912211

附:其它Bitmap图片转换工具

public class BitmapUtils {
	/**
	 *Bitmap to Drawable
	 * @param bmp
	 * @return Drawable
	 */
	public static Drawable bitmap2Drawable(Bitmap bmp) {
		BitmapDrawable bd = new BitmapDrawable(bmp);
		return bd;
	}
	/**
	 * Drawable to Bitmap
	 * @param drawable
	 * @return Bitmap
	 */
	public static Bitmap drawable2Bitmap(Drawable drawable) {
		BitmapDrawable bd = (BitmapDrawable) drawable;
		Bitmap bm = bd.getBitmap();
		return bm;
	}
	/**资源图片Resources to Bitmap
	 * @param activity
	 * @param resId
	 * @return Bitmap
	 */
	public static Bitmap getBitmapFromResources(Activity activity, int resId) {
		Resources res = activity.getResources();
		return BitmapFactory.decodeResource(res, resId);
	}
	/**截屏Screenshot 加背景框http://blog.csdn.net/yanzi1225627/article/details/8622257
	 * @param view
	 * @return Bitmap
	 */
	public static Bitmap getBitmapScreenshot(View view){
		//当前视图截屏view=getWindow().getDecorView()   
        int viewWidth = view.getMeasuredWidth();  
        int viewHeight = view.getMeasuredHeight();
        Bitmap b=null;
        if (viewWidth > 0 && viewHeight > 0) {  
            b = Bitmap.createBitmap(viewWidth, viewHeight, Config.RGB_565);  
            Canvas cvs = new Canvas(b);  
            //cvs.drawColor(view.getDrawingCacheBackgroundColor());
            view.draw(cvs);
            return b;
        }
            return b;
	}
	/**数组转图片byte[] to Bitmap
	 * @param bytee
	 * @return Bitmap
	 */
	public static Bitmap convertBytes2Bimap(byte[] bytee) {
		if (bytee.length == 0) {
			return null;
		}
		return BitmapFactory.decodeByteArray(bytee, 0,bytee.length);
	}
	/**图片转数组Bitmap to byte[]
	 * @param bm
	 * @return byte[]
	 */
	public static byte[] convertBitmap2Bytes(Bitmap bm) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
		return baos.toByteArray();
	}
	/**放大图片
	 * @param bitmap
	 * @return Bitmap
	 */
	public static Bitmap bigBitmap(Bitmap bitmap) {
	  Matrix matrix = new Matrix(); 
	  matrix.postScale(1.5f,1.5f); //长和宽放大缩小的比例
	  Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
	  return resizeBmp;
	 }
	/**缩小图片
	* @param bitmap
	* @return Bitmap
	*/
	 public static Bitmap smallBitmap(Bitmap bitmap) {
	  Matrix matrix = new Matrix(); 
	  matrix.postScale(0.8f,0.8f); //长和宽放大缩小的比例
	  Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
	  return resizeBmp;
	 }
	/**压缩图片解决OOM
	 * @param filepath SD卡路径
	 * @param widthpx 指定宽
	 * @param heightpx 指定高
	 * @return Bitmap
	 */
	public static Bitmap oomBitmap(String filepath,int widthpx,int heightpx){
		Options options =new BitmapFactory.Options();
		options.inJustDecodeBounds=true;//不在内存中读取图片
		options.inPreferredConfig = Bitmap.Config.RGB_565;//代表RGB位图
		BitmapFactory.decodeFile(filepath, options);//压缩前图片
		int width= options.outWidth;//原始图片宽
		int height=options.outHeight;//原始图片高
		if(height>heightpx||width>widthpx){
			int inheight=Math.round((float)height/(float)heightpx);
			int inwidth=Math.round((float)width/(float)widthpx);
			int inSize=inheight>inwidth?inheight:inwidth;
			options.inSampleSize=inSize;//缩放值:1不缩放 2为缩放1/2
		}
		options.inJustDecodeBounds=false;//在内存中创建图片
		Bitmap bm = BitmapFactory.decodeFile(filepath, options);//压缩后的图片
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bm.compress(Bitmap.CompressFormat.PNG,100, baos);//压缩图片
		return bm;
	}
}


android蛋疼的OOM

该技术贴仅仅作为一个总结的帖子吧,避免日后自己忘记了,好久没有写博客了,看着自己关注的大牛们依然持之以恒的更新着自己的博客,很是惭愧啊。相信很多人在实际工作中遇到Android某个类别的问题,很自然就...
  • mlj1668956679
  • mlj1668956679
  • 2015年10月19日 16:13
  • 777

新手学习java一分钟了解Java核心技术

学好java能够让程序员在大数据处理、分布式计算等方面有所发展,本文小编简单为大家介绍java设计基本概述,并将其与C++进行对比介绍。让你快速了解java的学习核心:...
  • javaniuniu
  • javaniuniu
  • 2016年05月17日 23:06
  • 1248

一分钟了解:Android 数字签名

Android 数字签名 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系 Android系统要求每一个安装进系统的应...
  • u011240877
  • u011240877
  • 2015年06月24日 12:41
  • 879

Android 捕获OOM方法

本文不是讲什么时候会发生OOM,而是讲OOM发生了如何去捕获他,处理它最近在分析Volley通信框架,看到ImageRequest的一段代码,非常值得借鉴 /** Decoding lock s...
  • Mr_LiaBill
  • Mr_LiaBill
  • 2015年12月07日 19:02
  • 2693

android中OOM出现的原因,以及解决办法

1.什么是OOM? 03-21 21:05:28.771: E/dalvikvm-heap(13316): Out of memory on a 10485776-byte allocati...
  • Caster_Saber
  • Caster_Saber
  • 2016年09月10日 14:55
  • 2550

Android OOM 排查与解决——图片加载优化

本文阐述分析了 Android 上面 OOM 出现的原因以及一些排查方法。并特别针对图片加载占用内存导致 OOM 的问题,提出了一些解决办法。...
  • ZhangYafengCPP
  • ZhangYafengCPP
  • 2016年03月07日 09:37
  • 2165

Android OOM原因总结

内存泄露是怎么回事 内存会泄露的原因 避免内存泄露 1.内存泄露怎么回事 一个程序中,已经不需要使用某个对象,但是因为仍然有引用指向它垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成...
  • boyupeng
  • boyupeng
  • 2015年08月18日 17:44
  • 9538

Android中如何避免OOM 异常

OOM 内存溢出,想要避免OOM 异常首先我们要知道什么情况下会导致OOM 异常。 1、图片过大导致OOM Android 中用bitmap 时很容易内存溢出, 比如报如下错误: Java.lan...
  • u010147215
  • u010147215
  • 2016年04月09日 22:19
  • 2607

Android OOM出现常见原因及解决办法

在前公司做一个图片处理的应用时, 项目交付的时候,客户的手机在运行应用的时候,一直在崩溃,而这个异常就是OutOfMemory的错误,简称为OOM, 搞得我们也是极其的崩溃,最后 ,我们是通过网上搜集...
  • hudfang
  • hudfang
  • 2016年06月29日 11:53
  • 14054

Android studio编译OOM

Android Studio编译报错 java.lang.OutOfMemoryError: GC overhead limit exceeded 原因:由于编译过程中导入jvm内存中资源过...
  • miao309410364
  • miao309410364
  • 2016年04月15日 16:14
  • 1589
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android一分钟了解OOM
举报原因:
原因补充:

(最多只允许输入30个字)