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();
}
}
}
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();
}
}
}