使用DiskLruCache需要用到几个文件。
public class ImageLoader {
private static final String TAG = "ImageLoader";
private static ImageLoader instance;
private Handler mHandler;
private LruCache<String, Bitmap> mLruCache;
//决定内存缓存的空间大小
private int maxMemSize = 4 * 1024 * 1024;//8388608 byte
// private int maxMemSize = 8;//8 M
public long maxDiskSize = 40 * 1024 * 1024;//20m
private DiskLruCache mDiskLruCache;
private Context mContext;
private ImageLoader(Context context) {
mContext = context;
mHandler = new Handler();
mLruCache = new LruCache<String, Bitmap>(maxMemSize) {
//Returns the size of the entry for key and value in user-defined units
//1.返回大小
//2.根据用户定义的单位
@Override
protected int sizeOf(String key, Bitmap value) {
// return super.sizeOf(key, value);//默认情况,一个图片只占一个byte
//返回图片占的字节总数
return value.getRowBytes() * value.getHeight();
}
};
try {
mDiskLruCache = DiskLruCache.open(getDirectory(), getAppversion(), 1, maxDiskSize);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 得到磁盘缓存的文件夹,优先放到外置sdcard
*
* @return
*/
public File getDirectory() {
File dir;
String externalStorageState = Environment.getExternalStorageState();
if (externalStorageState.equals(Environment.MEDIA_MOUNTED)) {//有sdcard
dir = new File(Environment.getExternalStorageDirectory(), "/Android/data/" + mContext.getPackageName() + "/icon");
if (!dir.exists()) {
//创建文件夹
dir.mkdirs();
}
return dir;
} else {
dir = mContext.getCacheDir();//data/data/包目录/caches
return dir;
}
}
public int getAppversion() {
try {
PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0);
return packageInfo.versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return 0;
}
public static ImageLoader getInstance(Context context) {
if (instance == null) {
instance = new ImageLoader(context);
}
return instance;
}
public void display(String url, final ImageView iv) {
//清空身上已有的图片
iv.setImageResource(R.drawable.news_pic_default);
iv.setTag(url);
String key = MD5Util.md5(url);
//从内存,返回
Bitmap bitmap = mLruCache.get(key);
if (bitmap != null) {
Log.d(TAG, "display 从内存里面加载图片");
iv.setImageBitmap(bitmap);
return;
}
//从磁盘,返回,存内存
bitmap = loadImgFromDisk(key);
if (bitmap != null) {
//设置图片
iv.setImageBitmap(bitmap);
Log.d(TAG, "display 从磁盘加载图片");
return;
}
//从网络,返回,存内存,存磁盘
new Thread(new LoadImgTask(url, iv)).start();
}
/**
* 从磁盘加载图片
*
* @param key
* @return
*/
private Bitmap loadImgFromDisk(String key) {
try {
DiskLruCache.Snapshot snapshot = mDiskLruCache.get(key);
if (snapshot != null) {
InputStream inputStream = snapshot.getInputStream(0);
//inputStream-->Bitmap
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
if (bitmap != null) {
return bitmap;
}
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
class LoadImgTask implements Runnable {
private String url;
private ImageView iv;
public LoadImgTask(String url, ImageView iv) {
this.url = url;
this.iv = iv;
}
@Override
public void run() {
//使用okHttp发起请求
try {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
Response response = okHttpClient.newCall(request).execute();
if (response.isSuccessful()) {
ResponseBody responseBody = response.body();
InputStream inputStream = responseBody.byteStream();
//inputStream-->bitmap
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_4444;
final Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, options);
//保存图片到内存中
save2Mem(url, bitmap);
//保存图片到磁盘中
save2Disk(url, bitmap);
mHandler.post(new Runnable() {
@Override
public void run() {
String curTag = (String) iv.getTag();
if (curTag.equals(url)) {
//设置
iv.setImageBitmap(bitmap);
}
}
});
}
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
}
/**
* 保存图片到磁盘中
*
* @param url
* @param bitmap
*/
private void save2Disk(String url, Bitmap bitmap) {
try {
String key = MD5Util.md5(url);
DiskLruCache.Editor editor = mDiskLruCache.edit(key);
if (editor != null) {
OutputStream outputStream = editor.newOutputStream(0);
//把bitmap保存到输出流里面
boolean compress = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
if (compress) {
editor.commit();
Log.d(TAG, "save2Disk 保存图片到磁盘中");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 保存图片到内存中
*
* @param url
* @param bitmap
*/
private void save2Mem(String url, Bitmap bitmap) {
if (TextUtils.isEmpty(url)) {
return;
}
Log.d(TAG, "save2Mem 保存图片到内存中");
String key = MD5Util.md5(url);
if (mLruCache != null) {
if (bitmap != null) {
mLruCache.put(key, bitmap);
}
}
}
}