缓存(LruCache)
为了加快图片加载速度,我们经常需要将已加载好的一定数量的图片存放于内存中,以提高用户体验,这里我们使用LruCache类实现内存缓存。
LruCache类位于android.util包内,可以通过以下代码进行声明:
private android.util.LruCache<String, Bitmap> mMemoryCache;
通过如下函数可以进行LruCache的初始化:
public void initLruCache(){
// 获取应用程序最大可用内存
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int cacheSize = maxMemory / 8;
// 设置图片缓存大小为程序最大可用内存的1/8
mMemoryCache = new android.util.LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount();
}
};
}
由于缓存区域肯定是固定的,所有我们把LruCache类设计成单例的,详细的LruCache类源码如下所示:
public class LruCache {
private android.util.LruCache<String, Bitmap> mMemoryCache;
private static LruCache mLruCache = null;
private LruCache(){}
//设计成单例模式,保证引用的是惟一的缓存区
public static LruCache getInstance(){
if (mLruCache == null){
mLruCache = new LruCache();
}
return mLruCache;
}
public void initLruCache(){
// 获取应用程序最大可用内存
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int cacheSize = maxMemory / 8;
// 设置图片缓存大小为程序最大可用内存的1/8
mMemoryCache = new android.util.LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount();
}
};
}
//设置该函数同步,防止同时有多个线程操作,保护数据的完整,安全。
public synchronized void addBitmapToLruCache(String key,Bitmap bitmap){
if (getBitmapFromMemoryCache(key) == null) {
mMemoryCache.put(key, bitmap);
}
}
public Bitmap getBitmapFromMemoryCache(String key) {
return mMemoryCache.get(key);
}
public void removeBitmapFromLruCache(String key){
mMemoryCache.remove(key);
}
//我没有写清除缓存的代码,大家可以自己写一下很简单的。
}
好了,我们的缓存就讲到这里,这样我们就基本完成了我们工具类的书写,其中第一讲讲的是实体类和MediaProvider,第二讲是PhotoBitmapFactory(生产Bitmap的类),这一讲是缓存工具类,大概可以看出我是从Dao层到Service层讲的,下一讲我们就开始讲具体的异步请求了,把拿到的数据展示出来噻。