(1)主界面是一个GridView, 主要机制都实现在gridview中.
(2)核心成员
//记录下载任务
private Set<BitmapWorkerTask> taskCollection;
//内存缓存
private LruCache<String, Bitmap> mMemoryCache;
//硬盘缓存
private DiskLruCache mDiskLruCache;
(3)实现过程
<1>在adaper中对LruCache和DiskLruCache进行初始化:
// 获取应用程序最大可用内存
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int cacheSize = maxMemory / 8; //134217728byte = 128M
// 设置图片缓存大小为程序最大可用内存的1/8
mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount();
}
};
try {
// 获取图片缓存路径
File cacheDir = getDiskCacheDir(context, "thumb");
if (!cacheDir.exists()) {
cacheDir.mkdirs();
}
// 创建DiskLruCache实例,初始化缓存数据
mDiskLruCache = DiskLruCache
//缓存地址, 版本号(当版本号变化会自动清理缓存的), 一个key对应几个文件, 缓存容量
.open(cacheDir, getAppVersion(context), 1, 10 * 1024 * 1024);//10M
} catch (IOException e) {
e.printStackTrace();
}
<2>在getview中进行image关联, 先设置一个空照片, 当下载之后, 利用图片的url作为tag找个这个imageview进行更新.
imageView.setTag(url);
imageView.setImageResource(R.drawable.empty_photo);
loadBitmaps(imageView, url);
<3>加载图片
a.创建一个下载图片的AsyncTask<String, Void, Bitmap>, 参数是url, 空, 返回类型.
b.在这里进行图片下载, 下载的过程实际是将网上图片保存到硬盘缓存的过程,下载完成之后 将文件保存到内存缓存中, 同时将下载
任务从taskset中取出.下载成功的task不需要监控了.
c.硬盘缓存的key是图片url的hash值, 因为直接用url当文件名可能有非法字符. 内存缓存就可以直接用url当key了.
d.下载完成从内存缓存中取出image,设置到imageview上就可以了
ImageView imageView = (ImageView) mphotowall.findViewWithTag(imageUrl);
if (imageView != null && bitmap != null) {
imageView.setImageBitmap(bitmap);
}
taskCollection.remove(this);
}
源码下载:
点击打开链接