笑谈风云,一语定乾坤。大家好,我是皖江。从今天开始,我将和大家一起分享我的Android框架学习经验之路。万丈高楼平地起,我就从小小的缓存策略开始学习吧。
简介:说起Android的缓存,主要用到的图片的缓存。当然,其他一些视频、音频文件也是可以做的。今天我主要以图片缓存为例子来进行学习。应用里所需要的图片大多都是需要从网络进行下载的,不管用户有多少流量,都敌不过中国移动一天接近一个亿的收入。一个很耗流量的APP,不是个好APP,是要被用户打入冷宫的。这是其一,其二就是在一个页面显示多图也是需要通过缓存来实现图片的加载,否则android系统给与APP运行的内存很快就会被消耗殆尽,然后APP就光荣的om了。
三级缓存机制:首先从内存中加载文件,如果没有则在硬盘中加载文件,如果没有则访问网络下载文件。从速度上来看也是逐级往下减的,但是这种三级缓存模式也是非常受用的。不单单可以用于图片,也可以用于其他文件。
Android系统本身提供了缓存技术,叫LruCache。LruCache在API12就引入了,低版本可以在support依赖包中获取。
LruCache的算法原理就是把最近使用的对象用强引用存储在LinkedHashMap中,并且会将很少使用的对象在缓存值将满之前从内存中移除掉。在LinkedHashMap中,先入的对象会保存在底部,新入对象放在顶部。当内存将满时,优先从底部删除对象。LruCache提供sizeOf()方法来设置缓存个数。
private final LinkedHashMap<K, V> map;
LruCache的构造方法:
public LruCache(int maxSize) { if (maxSize <= 0) { throw new IllegalArgumentException("maxSize <= 0"); } this.maxSize = maxSize; this.map = new LinkedHashMap<K, V>(0, 0.75f, true); }传入了一个最大值,用来限制用于缓存的内存大小。一般我们推荐用当前APP可用内存的1/8来做缓存。
通过以下方法获取APP可用内存:
public int getMemory(){ return ((ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass(); }
下面是个具体的使用方法:
LruCache<String,Bitmap> lruCache = new LruCache<String,Bitmap>(getMemory()*1024*1024/8){@Override protected int sizeOf(String key , Bitmap value) { return value.getByteCount()/ 1024 ; }} ;
/** * 添加图片到缓存中 * @param key * @param bitmap */ public void addBitmapToCache(String key,Bitmap bitmap){ if(getBitmapFromCache(key) == null){ lruCache.put(key,bitmap); } } /** * 从内存中获取该图片对象 * @param key * @return */ public Bitmap getBitmapFromCache(String key){ return lruCache.get(key); }以上就是LruCache的基本用法。LruCache用上去很简单,所以便于扩展,下次再带来LruCache的扩展 DiskLruCache框架的学习。