摘要:项目中做了一个关于在线壁纸的App,其中对于网络图片的处理是至关重要的,既要考虑性能,又要考虑图片所占用内存的限制。因此这里就把网络图片下载部分的代码整理处来,这里主要介绍图片三级缓存的策略。
图片的缓存策略主要涉及到内存缓存,和磁盘缓存。这也是主流缓存策略。通过查阅资料,内存的主流缓存策略大致有以下三种:
1. 软引用
2. LruCache(android-support-v4.jar提供的一个类)
3. LruCache+软引用
但是在这里不太建议仅仅使用软引用,因为高版本的Android系统中,软引用变的不那么靠谱,就算是内存足够的时候也可能会将其回收,因此命中率会降低。
若单使用LruCache虽然能够满足需求,但是那些替换出来的对象就白白浪费了。
在我的项目中使用的是第三种策略,当被LruCache“遗弃”的对象将其变成软引用对象。这样可以提高命中率。
关于LruCache算法,这里不做介绍了,有兴趣的可以阅读相应源码或者参考http://blog.csdn.net/linghu_java/article/details/8574102。
磁盘缓存策略,我采用的是DiskLruCache类,该类不是Android系统提供的,不过开源库上有提供源码,我们只需要将其拷贝进入工程就行。有兴趣的也可以读读其源码,加深认识。
不管LruCache和DiskLruCache其中核心的属性是LinkedHashMap,并将LinkedHashMap设置为按照访问顺序排列。有兴趣的可以参考源码或者参考http://uule.iteye.com/blog/1522291。
有了相关知识储备,现在开始编码实现,废话不多说直接上代码。
package com.dighammer.imageloader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.R.mipmap;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.widget.ImageView;
/**
* @author DigHammer
* */
public class ImageLoader {
private static final String TAG = "Dig.ImageLoader";
// 内存缓存
private LruMemoryCache mMemoryCache = LruMemoryCache.getInstance();
// 下载图片所使用的线程池
private ExecutorService mExecutorService;
// 文件缓存
public static DiskLruCache sDiskLruCache;
// SD卡分配的存储大小
private static final int DISK_CACHE_SIZE = 1024 * 1024 * 50;// 50MB
// 单利模式
private static ImageLoader instance = null;
// 监听图片下载完成事件
private OnImageDownloadedListener mListener;
private