zhu的工作日记:图片三级缓存的工具类(android)
2015-12-16 11:06
501 查看
工作点滴,汇聚成雨
(图片三级缓存的工具类)
(图片三级缓存的工具类)
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); } } }
相关文章推荐
- 关于常量,枚举和注解
- Android对齐属性大全
- Android 屏幕适配方案
- Android - 文件读写操作 总结
- 详解Android中IntentService的使用方法
- (Bitmap OOM) BitmapFactory.nativeDecodeStream
- Android项目使用support v7时遇到的问题
- Android编程之在SD卡上进行文件读写操作实例详解
- Android实战 - 音心播放器 (MusicActivity-音乐播放页面界面实现)
- Android学习之位图BitMap
- Android混淆、反编译基础教程
- Android音频系统之AudioFlinger(二)
- Android 权限设置大全
- android ScrollView嵌套RecyclerView
- android实现之高清音频录制编码
- Android音频系统之AudioFlinger(一)
- android流媒体之云视频播放-android视频播放器SDK-视频播放不在犯困
- android aidl浅析
- Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果
- Android音频系统之音频框架