为什么要缓存图片:
(1)根据具体设备的不同Android系统为每个应用分配了固定内存空间供应用使用;
(2)图片是一种很占内存的资源文件,如果界面中加载一张图片还好说,如果要加载大量的图片就会超过系统为应用分配的空间发生OOM异常,使程序奔溃;
2.LruCache:
主要算法原理:将最近使用的对象用强应用存储到LinkedHashMap中,在缓存值达到最大是把最近最少使用的对象从缓存区中移除;
3.实现步骤:
(1)创建缓存区:
<code>//1.声明Lrucache对象,和map类似也是采用键值对的形式,这里的key使用的是int</code>
<code> </code><code>private</code> <code>LruCache<Integer, Bitmap> bitmapcache = </code><code>null</code><code>; </code>
<code>//2.为Lrucache分配内存空间</code>
<code> </code><code>//2.1首先获取系统为该应用分配的最大空间,以kb为单位</code>
<code> </code><code>final</code> <code>int</code> <code>maxMemory = (</code><code>int</code><code>) (Runtime.getRuntime().maxMemory() / </code><code>1024</code><code>);</code>
<code> </code><code>//2.2 将应用的内存的1/8作为该缓存区的大小实例化缓存区对象</code>
<code> </code><code>int</code> <code>cacheSize = maxMemory / </code><code>8</code><code>;</code>
<code> </code><code>bitmapcache = </code><code>new</code> <code>LruCache<Integer, Bitmap>(maxMemory){</code>
<code> </code><code>//2.3 规定缓存区中每个item的大小,即每个图片的大小,默认是实际大小;(以kb为单位)</code>
<code> </code><code>protected</code> <code>int</code> <code>sizeOf(Integer key, Bitmap bitmap) {</code>
<code> </code><code>// The cache size will be measured in kilobytes rather than</code>
<code> </code><code>// number of items.</code>
<code> </code><code>return</code> <code>bitmap.getRowBytes() * bitmap.getHeight() / </code><code>1024</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>};</code>
(2)在加载图片的方法中将得到的图片放入缓存区
<code>bitmapcache.put(bitmapId, bitmap);</code>
(3)在使用Bitmap时判断缓存区是否存在对应key值的bitmap对象,如果存在则直接读取,如果不存在在调用加载图片的方法进行获取;
<code>if</code><code>(bitmapcache.get(bitmapId)!=</code><code>null</code><code>){</code>
<code> </code><code>bitmap = bitmapcache.get(bitmapId);</code>
<code> </code><code>iv.setImageBitmap(bitmap);</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>//根据图片加载方法加载图片</code>
<code>}</code>
本文转自wauoen51CTO博客,原文链接:http://blog.51cto.com/7183397/1606933 ,如需转载请自行联系原作者