Android艺术——Bitmap高效加载和缓存(1)

通过Bitmap我们可以设计一个ImageLoader,实现应该具有的功能是:

图片的同步加载;图片的异步加载;图片的压缩;内存缓存;磁盘缓存;网络获取;

1.加载

首先提到加载:BitmapFactory类提供了四类方法:decodeFile、decodeResource、decodeStream和decideByteArray。分别是文件系统、资源、输入流和字节数加载Bitmap对象。

2.压缩

如何进行图片的压缩?首先我们为什么图片压缩呢?因为很多时候ImageView尺寸小于图片原始尺寸,没必要把原始图片全部加载到内存,可能造成oom,并且ImageView也没办法全部显示原始图片,采样压缩将缩小后的图片在ImageView中显示,同时降低图片内存占用从而避免oom,提高Bitmap加载性能。图片内存太大会影响用户的体验,而且对设备存储也是浪费了资源。怎么压缩?通过BitmapFactory.Options来缩放图片,主要是inSampleSize参数,叫采样率。inSampleSize=1就是和原图一样,inSampleSize=4,加载后的图片长和宽是原图片长和宽的1/4,像素数是原图片的1/16,加载后占用的内存也是原图片占用内存的1/16.

其中步骤是:

(1)BitmapFactory.Options的inJustDecodeBound参数设为true并加载图片;

(2)从BitmapFactory.Options中取出图片原始宽高信息,对应outWidth和outHeight

(3)结合目标view(imageView)所需图片大小,计算采样率;

(4)将BitmapFactory.Options的inJustDecodeBounds置为false,重新加载。

3.缓存

其中内存缓存与磁盘缓存是最为核心的,缓存就是为了移动端服务的,例如:有一大批的网络图片,需要下载后才能在用户界面上显示,如果是在PC端可以直接下载到本地进行显示,但是在移动端我们都是需要大量的流量进行下载,为了解决流量消耗的问题,缓存就是我们的不二之选,有了缓存我们从网络第一次网络加载之后,图片缓存在我们的设备之中,当我们再次查询图片的时候,就不用再次从网络上获取,而是先从设备的缓存上进行获取,如果没有,再考虑从网络上获取,这就是缓存策略。

目前我们常用的缓存算法是LRU算法,就是近期最少使用算法,核心就是如果缓存存满时候,有优先淘汰那些近期最少使用的缓存对象。说到LRU其中的两种缓存:LruCahe与DisKLruCahe,前者是用于实现内存缓存,后者则是充当了储存设备的缓存。

这次我介绍了Bitmap 的加载与缓存,下次我们进一步的分析具体代码。

上一篇:你能不用计算机来计算S=a+(a+1)+(a+2) + ...... + b的解的数目吗?


下一篇:Android 多线程 异步加载