首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > VSTS >

Bit地图Factory.decodeResource VS Bit地图Factory.decodeStream

2012-10-20 
BitmapFactory.decodeResource VS BitmapFactory.decodeStreamBitmapFactory.decodeResource和BitmapFacto

BitmapFactory.decodeResource VS BitmapFactory.decodeStream
       BitmapFactory.decodeResource和BitmapFactory.decodeStream,相信对于有过android app开发经验的人来说都是很熟悉了。关于Bitmap的OOM问题,网上也有很多文章进行了分析,不少文章都说为避免OOM,最好使用BitmapFactory.decodeStream,但是具体说明原因的我至今没有找到,所以趁着10.1期间有空,就调查了一番,希望结果对大家能有帮助。

      先来张时序图,看了这张图,估计很多问题都不用说明了:

Bit地图Factory.decodeResource VS Bit地图Factory.decodeStream


下面做些说明:

1,函数externalBytesAvailable(...)的内存计算方法详细请参见文章《Android Bitmap内存限制》;

2,Bitmap.createScaledBitmap时可能会对Bitmap进行缩放,缩放所使用的Options请参见下面这段代码:

    public static Bitmap decodeResourceStream(Resources res, TypedValue value,            InputStream is, Rect pad, Options opts) {        if (opts == null) {            opts = new Options();        }        if (opts.inDensity == 0 && value != null) {            final int density = value.density;            if (density == TypedValue.DENSITY_DEFAULT) {                opts.inDensity = DisplayMetrics.DENSITY_DEFAULT;            } else if (density != TypedValue.DENSITY_NONE) {                opts.inDensity = density;            }        }                if (opts.inTargetDensity == 0 && res != null) {            opts.inTargetDensity = res.getDisplayMetrics().densityDpi;        }                return decodeStream(is, pad, opts);    }
当放大时,会加大造成OOM的可能性;
3,BitmapFactory.decodeResource比起BitmapFactory.decodeStream来说,在没有参数Options opts的情况下,确实是多占用了内存,因为多了BitmapFactory.finishDecode这一步,这里多了一个Bitmap.createScaledBitmap操作;

4,关于使用BitmapFactory.decodeResource和BitmapFactory.decodeStream的效率对比,大家可以参见文章《Android 内存优化测试》

5,关于文章《Android 内存优化测试》提到的使用BitmapDrawable是最节省内存的方法,原因是frameworks\base\core\java\android\content\res\Resources.java对Bitmap做了缓存处理,文中所有的array其实都是指向同一个Bitmap,这一点也可以通过Bitmap.toString的输出信息来证明。

备注:时序图看不清楚的,可以到http://download.csdn.net/detail/imyfriend/4617329下载原图。

2楼easyer2012昨天 10:42
那张图片看不到清楚
Re: imyfriend昨天 12:14
回复easyer2012n留下你的邮箱吧!我发给你
Re: easyer20127小时前
回复imyfriendn嗯,好的,我的邮箱是sz1128@qq.com,多谢啦
1楼imyfriend昨天 09:09
我上传了一份,从这里(http://download.csdn.net/detail/imyfriend/4617329)下吧

热点排行