图片三级缓存+线程池队列
来源:互联网 发布:ios蜂窝数据快捷开关 编辑:程序博客网 时间:2024/05/17 23:25
MemoryCache.class
public class MemoryCache { public LruCache<String, Bitmap> mMeLruCache; public MemoryCache(){ int maxMemory=(int) (Runtime.getRuntime().maxMemory()/8); mMeLruCache=new LruCache<String, Bitmap>(maxMemory){ protected int sizeOf(String key, Bitmap value) { return value.getRowBytes()*value.getHeight(); } }; } public void putBitmap(String url,Bitmap bitmap){ mMeLruCache.put(url, bitmap); } public Bitmap getBitmap(String url){ return mMeLruCache.get(url); }}
NetCache.class
public class NetCache { public static final int SUCCESS = 0; public static final int FAILED = 1; private Handler mHandler; private MemoryCache mMemoryCache; // 内存缓存对象 private ExecutorService mExecutorService; // 线程池对象 public NetCache(Handler handler, MemoryCache memoryCache) { this.mHandler = handler; this.mMemoryCache = memoryCache; // 构建一个内部有5个线程的线程池 mExecutorService = Executors.newFixedThreadPool(5); } /** * 获取图片从网络中 * @param url */ public void getBitmapFromNet(String url, int tag) {// new Thread(new InternalRunnable(url, tag)).start(); mExecutorService.execute(new InternalRunnable(url, tag)); } class InternalRunnable implements Runnable { private String url; // 当前任务需要请求的网络地址 private int tag; // 当前这次请求的图片的标识 public InternalRunnable(String url, int tag) { this.url = url; this.tag = tag; } @Override public void run() { // 访问网络, 抓取图片 HttpURLConnection conn = null; try { conn = (HttpURLConnection) new URL(url).openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); conn.connect(); int responseCode = conn.getResponseCode(); if(responseCode == 200) { InputStream is = conn.getInputStream(); // 把流转换成图片 Bitmap bm = BitmapFactory.decodeStream(is); Message msg = mHandler.obtainMessage(); msg.obj = bm; msg.arg1 = tag; msg.what = SUCCESS; msg.sendToTarget(); // 向本地存一份 LocalCache.putBitmap(url, bm); // 向内存存一份 mMemoryCache.putBitmap(url, bm); return; } } catch (Exception e) { e.printStackTrace(); } finally { if(conn != null) { conn.disconnect(); // 断开连接 } } mHandler.obtainMessage(FAILED).sendToTarget(); } }}
LocalCache.class
public class LocalCache { private static final File CACHEDIR = new File("/mnt/sdcard/sky"); /** * 根据url, 向本地存储一张图片 * @param url * @param bm */ public static void putBitmap(String url, Bitmap bm) { try { String fileName = MD5Encoder.encode(url).substring(0, 10); if(!CACHEDIR.exists()) { CACHEDIR.mkdir(); } File cacheFile = new File(CACHEDIR, fileName); FileOutputStream fos = new FileOutputStream(cacheFile); bm.compress(CompressFormat.JPEG, 100, fos); } catch (Exception e) { e.printStackTrace(); } } /** * 根据url从本地缓存中取出图片 * @param url * @return */ public static Bitmap getBitmap(String url) { try { String fileName = MD5Encoder.encode(url).substring(0, 10); File cacheFile = new File(CACHEDIR, fileName); if(cacheFile.exists()) { return BitmapFactory.decodeFile(cacheFile.getPath()); } } catch (Exception e) { e.printStackTrace(); } return null; }}
ImageLoader.clsaa
public class ImageLoader { private NetCache mNetCache; private MemoryCache mMemoryCache; public ImageLoader(Handler handler) { // 定义内存缓存对象 mMemoryCache = new MemoryCache(); // 定义网络缓存对象. mNetCache = new NetCache(handler, mMemoryCache); } /** * 根据url获取图片 * @param url * @return */ public Bitmap getImageFromUrl(String url, int tag) { // 1. 去内存中取, 取到了之后直接返回. Bitmap bm = mMemoryCache.getBitmap(url); if(bm==null){ bm = LocalCache.getBitmap(url); } if(bm != null) { System.out.println("从内存中取"); return bm; } // 2. 去本地中取, 取到了之后直接返回. if(bm != null) { System.out.println("从本地中取"); return bm; } System.out.println("从网络中取"); // 3. 去网络中取, 开启子线程异步抓取, 不能直接返回. 当抓取完毕后, 得到图片, 使用handler发送消息发给调用者. mNetCache.getBitmapFromNet(url, tag); return null; }}
使用方法:
public class DataAdapter extends BaseAdapter{ private List<Data> datas; private ImageLoader imageLoader; private ListView list; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case NetCache.SUCCESS: Bitmap bm = (Bitmap) msg.obj; // 图片 int tag = msg.arg1; // 当前抓取图片的那个ImageView的tag ImageView iv = (ImageView) list.findViewWithTag(tag); iv.setImageBitmap(bm); break; case NetCache.FAILED:// Toast.makeText(mContext, "抓取图片失败", 0).show(); Log.d("Sky","抓取图片失败"); break; default: break; } } }; public DataAdapter(List<Data> datas,ListView list) { super(); this.datas = datas; this.list=list; imageLoader=new ImageLoader(handler); } @Override public int getCount() { // TODO Auto-generated method stub return datas.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return datas.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } Holder holder=null; @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView==null) { convertView= LayoutInflater.from(parent.getContext()).inflate(R.layout.image, null); holder=new Holder(); holder.imageView1=(ImageView) convertView.findViewById(R.id.imageView1); convertView.setTag(holder); }else{ holder=(Holder) convertView.getTag(); } Bitmap bitmap = imageLoader.getImageFromUrl(datas.get(position).getUrl(), position); if(bitmap != null) { // 当前是从内存或者本地取的图片 holder.imageView1.setImageBitmap(bitmap); } return convertView; } private class Holder{ private ImageView imageView1; public Holder() { } }}
0 0
- 图片三级缓存+线程池队列
- 图片的三级缓存
- Android 图片三级缓存
- Android 图片三级缓存
- Android 图片三级缓存
- 三级图片缓存介绍
- 图片的三级缓存
- 图片的三级缓存
- 图片处理,三级缓存
- 三级缓存图片类
- android图片三级缓存
- Android三级图片缓存
- 关于图片三级缓存
- 图片的三级缓存
- Android图片三级缓存
- 图片三级缓存
- android图片三级缓存
- 图片的三级缓存
- android RadioGroup和RadioButton使用注意
- 交叉验证(CrossValidation)方法思想简介
- 关于Android工程从eclipse迁移至android studio的过程
- android 自定义通知布局Notification,点击Notification导航切换回原Activity
- 这两天的学习
- 图片三级缓存+线程池队列
- Object
- Waterfall
- CodeForces 602A Two Bases(简单题,比较两个不同进制数的大小)——Codeforces Beta Round #333 (Div. 2)
- NoSuchMethodError 集合
- getResource()函数的路径问题
- MAC下用unity进行开发书写中文-Visual Studio Code
- 关于蓝桥杯训练题任务目标
- 如何让360打开时默认使用极速模式?