预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共58页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

BitmapFactory中Options的使用示例 目录: TOC\o"1-2"\h\uHYPERLINK\l_Toc21277一、加载巨图 PAGEREF_Toc212771 HYPERLINK\l_Toc29067二、图片缓存技术 PAGEREF_Toc290675 HYPERLINK\l_Toc13149三、DiskLruCache完全解析,硬盘缓存的最佳方案 PAGEREF_Toc1314910 HYPERLINK\l_Toc20225四、LruCache和DiskLruCache完美结合 PAGEREF_Toc2022530  一、加载巨图 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如说系统图片库里展示的图片大都是用手机摄像头拍出来的,这些图片的分辨率会比我们手机屏幕的分辨率高得多。大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常。我们可以通过下面的代码看出每个应用程序最高可用内存是多少。 [java]HYPERLINK"http://blog.csdn.net/guolin_blog/article/details/9316683"\o"viewplain"viewplainHYPERLINK"http://blog.csdn.net/guolin_blog/article/details/9316683"\o"copy"copy intmaxMemory=(int)(Runtime.getRuntime().maxMemory()/1024); Log.d("TAG","Maxmemoryis"+maxMemory+"KB"); 因此在展示高分辨率图片的时候,最好先将图片进行压缩。压缩后的图片大小应该和用来展示它的控件大小相近,在一个很小的ImageView上显示一张超大的图片不会带来任何视觉上的好处,但却会占用我们相当多宝贵的内存,而且在性能上还可能会带来负面影响。下面我们就来看一看,如何对一张大图片进行适当的压缩,让它能够以最佳大小显示的同时,还能防止OOM的出现。 BitmapFactory这个类提供了多个解析方法(decodeByteArray,decodeFile,decodeResource等)用于创建Bitmap对象,我们应该根据图片的来源选择合适的方法。比如SD卡中的图片可以使用decodeFile方法,网络上的图片可以使用decodeStream方法,资源文件中的图片可以使用decodeResource方法。这些方法会尝试为已经构建的bitmap分配内存,这时就会很容易导致OOM出现。为此每一种解析方法都提供了一个可选的BitmapFactory.Options参数,将这个参数的inJustDecodeBounds属性设置为true就可以让解析方法禁止为bitmap分配内存,返回值也不再是一个Bitmap对象,而是null。虽然Bitmap是null了,但是BitmapFactory.Options的outWidth、outHeight和outMimeType属性都会被赋值。这个技巧让我们可以在加载图片之前就获取到图片的长宽值和MIME类型,从而根据情况对图片进行压缩。如下代码所示: [java]HYPERLINK"http://blog.csdn.net/guolin_blog/article/details/9316683"\o"viewplain"viewplainHYPERLINK"http://blog.csdn.net/guolin_blog/article/details/9316683"\o"copy"copy BitmapFactory.Optionsoptions=newBitmapFactory.Options(); options.inJustDecodeBounds=true; BitmapFactory.decodeResource(getResources(),R.id.myimage,options); intimageHeight=options.outHeight; intimageWidth=options.outWidth; StringimageType=options.outMimeType; 为了避免OOM异常,最好在解析每张图片的时候都先检查一下图片的大小,除非你非常信任图片的来源,保证这些图片都不会超出你程序的可用内存。 现在图片的大小已经知道了,我们就可以决定是把整张图片加载到内存中还