工作点滴,汇聚成雨
(图片三级缓存的工具类)
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.os.Handler;
import android.support.v4.util.LruCache;
import android.widget.ImageView;
/**
*
* @创建描述:图片三级缓存的工具类
*
*/
public class ImageUtils
{
private static LruCache<String, Bitmap> mCaches;
private static Handler mHandler;
private static ExecutorService mPool;
private Context mContext;
private Map<ImageView, String> mTags = new LinkedHashMap<ImageView, String>();
public ImageUtils(Context context) {
this.mContext = context;
if (mCaches == null)
{
// 申请的内存空间
int maxSize = (int) (Runtime.getRuntime().freeMemory() / 4);
mCaches = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap value)
{
// 判断添加进入的value的占用内存的大小
return value.getRowBytes() * value.getHeight();
}
};
}
if (mHandler == null)
{
mHandler = new Handler();
}
if (mPool == null)
{
mPool = Executors.newFixedThreadPool(3);
}
}
/**
* 给imageView加载url对应的图片
*
* @param iv
* @param url
*/
public void display(ImageView iv, String url)
{
// 1. 从内存中获取
Bitmap bitmap = mCaches.get(url);
if (bitmap != null)
{
// 内存中有,显示
iv.setImageBitmap(bitmap);
return;
}
// 2. 从本地去获取
bitmap = loadFromLocal(url);
if (bitmap != null)
{
// 本地中有,显示
iv.setImageBitmap(bitmap);
return;
}
// 3. 从网络中获取
loadFromNet(iv, url);
}
private void loadFromNet(ImageView iv, String url)
{
mTags.put(iv, url);// url是imageView最新的地址
// 耗时操作
// 线程池管理
mPool.execute(new LoadImageTask(iv, url));
}
private class LoadImageTask implements Runnable
{
private String url;
private ImageView iv;
public LoadImageTask(ImageView iv, String url) {
this.iv = iv;
this.url = url;
}
@Override
public void run()
{
try
{
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setConnectTimeout(5000);// 连接服务器超时时间
conn.setReadTimeout(5000);// 读取超时时间
conn.connect();// 连接服务器
// 获取流
InputStream is = conn.getInputStream();
// 将流变为bitmap
Bitmap bitmap = BitmapFactory.decodeStream(is);
// 存储到本地
save2Local(bitmap, url);
// 存储到内存
mCaches.put(url, bitmap);
String recentlyUrl = mTags.get(iv);
if (url.equals(recentlyUrl))
{
// 显示到UI
mHandler.post(new Runnable() {
@Override
public void run()
{
display(iv, url);
}
});
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
private Bitmap loadFromLocal(String url)
{
// 本地需要有存储的路径
File file = getCacheFile(url);
if (file.exists())
{
// 本地有
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
// 存储到内存
mCaches.put(url, bitmap);
return bitmap;
}
return null;
}
public void save2Local(Bitmap bitmap, String url) throws FileNotFoundException
{
File file = getCacheFile(url);
FileOutputStream stream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 100, stream);
}
private File getCacheFile(String url)
{
String name = MD5Utils.encode(url);
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state))
{
// sd存在的
File dir = new File(Environment.getExternalStorageDirectory(), "/Android/data/" + mContext.getPackageName() + "/icon");
if (!dir.exists())
{
dir.mkdirs();
}
return new File(dir, name);
}
else
{
File dir = new File(mContext.getCacheDir(), "/icon");
if (!dir.exists())
{
dir.mkdirs();
}
return new File(dir, name);
}
}
}