三级缓存

package com.itheima14.smartbj14.acitivity.utils;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap.CompressFormat;
import android.support.v4.util.LruCache;
import android.widget.ImageView;


import com.itheima14.smartbj14.acitivity.HomeActivity;
import com.lidroid.xutils.BitmapUtils;


/**
 * @author goudan
 * @comp 黑马程序员深圳 修改日期:$Date: 2015-10-31 16:43:38 +0800 (Sat, 31 Oct 2015) $ 版 本
 *       号:$Rev: 66 $ 修 改 人:$Author: goudan $ 修改内容:图片的三级缓存
 */
public class PhotosUtils {


// 用虚拟机可用内存的四分之一做缓存大小
private long maxSize = Runtime.getRuntime()
.freeMemory() / 4;
// 软引用的数据类型的容器
private LruCache<String, Bitmap> mLruCache = new LruCache<String, Bitmap>(
(int) maxSize) {


@Override
protected int sizeOf(
String key,
Bitmap value) {
// 计算每一个数据的大小
return value
.getRowBytes()
* value.getHeight();// 获取字节大小
}


};


private HomeActivity mContext;
private File mCacheDir; // 缓存目录

private HashMap<ImageView, String> murlTags = new HashMap<ImageView, String>();
private ExecutorService threadPool;


public PhotosUtils(HomeActivity context) {
this.mContext = context;
mCacheDir = mContext.getCacheDir();

//创建线程池
threadPool = Executors.newFixedThreadPool(5);
}

@Override
protected void finalize() throws Throwable {
threadPool.shutdown();// 线程池的释放
super.finalize();
}


public void display(ImageView iv_pic, String url) {
// 显示图片
// 1. 内存获取图片
Bitmap bitmap = mLruCache.get(url);
if (bitmap != null) {
PrintUtils.print("从内存获取图片");
// 内存有数据
iv_pic.setImageBitmap(bitmap);
return;
}
// 2. 本地获取图片
bitmap = getBitmapFromCache(url);
if (bitmap != null) {
PrintUtils.print("从本地获取图片");
// 内存有数据
iv_pic.setImageBitmap(bitmap);
// 往内存中存一份
mLruCache.put(url, bitmap);
return;
}


// 3. 网络获取图片


getPicFromNet(iv_pic, url);


}


/**
* 从本地获取图片

* @param url
* @return
*/
private Bitmap getBitmapFromCache(String url) {
// TODO Auto-generated method stub
String fileName = url.substring(url.lastIndexOf('/') + 1);


// 本地文件
File file = new File(mCacheDir, fileName);

//把文件转成bitmap

Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());



return bitmap;
}


private void getPicFromNet(ImageView iv_pic, String url) {
// 从网络获取图片
// 子线程
PrintUtils.print("从网络获取图片");
//把url对应iv绑定
murlTags.put(iv_pic, url);
//每次启动线程耗时
//new Thread(new DownLoadPic(iv_pic, url)).start();
threadPool.submit(new DownLoadPic(iv_pic, url));
}


private class DownLoadPic implements Runnable {
private ImageView iv_pic;
private String url;


public DownLoadPic(ImageView iv_pic, String url) {
this.iv_pic = iv_pic;
this.url = url;
}


@Override
public void run() {
// 网络下载图片


try {
URL downUrl = new URL(url);
// 获取连接
HttpURLConnection con = (HttpURLConnection) downUrl
.openConnection();
con.setConnectTimeout(8000);// 8秒超时时间设置
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
if (responseCode == 200) {
// 获取正确的结果
InputStream inputStream = con.getInputStream();
// 把is变成bitmap
final Bitmap bitmap = BitmapFactory
.decodeStream(inputStream);





// 显示
mContext.runOnUiThread(new Runnable() {


@Override
public void run() {
//是否是最后一次访问
if (murlTags.get(iv_pic).equals(url)) {
//最后一次访问的url
// 1. 内存存一份
mLruCache.put(url, bitmap);


// 2. 本地存一份
// 把本地数据放到cache目录 方便手机卫士清理缓存adil
writeBitmap2Cache(url, bitmap);
// TODO Auto-generated method stub
//3. 显示图片
iv_pic.setImageBitmap(bitmap);
}

}
});


inputStream.close();
}


con.disconnect();


} catch (Exception e) {


e.printStackTrace();
}
}
}


/**
* 写数据到cache目录

* @param url
* @param bitmap
*/
public void writeBitmap2Cache(String url, Bitmap bitmap) {
// TODO Auto-generated method stub
String fileName = url.substring(url.lastIndexOf('/') + 1);


// 本地文件
File file = new File(mCacheDir, fileName);


// bitmap写到本地文件中
try {
bitmap.compress(CompressFormat.JPEG, 100,
new FileOutputStream(file));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值