从本地缓存图片
LocalCacheUtils
1 /** 2 * 3 * 从本地读图片 4 * @param url 5 */ 6 public Bitmap getBitmapFromlocal(String url){ 7 try { 8 String filename = MD5Encoder.encode(url); 9 10 File file=new File(CACHE_PATH, filename);//通过父文件夹与自己的文件名称来创建一个文件 11 12 if(file.exists()){ 13 Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(file)); 14 return bitmap; 15 } 16 17 } catch (Exception e) { 18 // TODO Auto-generated catch block 19 e.printStackTrace(); 20 } 21 return null; 22 23 } 24 25 /** 26 * 27 * 将图片写到本地 28 * @param url 29 * @param bitmap 30 */ 31 public void setBitmapTolocal(String url,Bitmap bitmap){ 32 try { 33 String filename = MD5Encoder.encode(url); 34 File file=new File(filename); 35 File parentFile = file.getParentFile(); 36 if(!parentFile.exists()){//如果文件夾不存在,則创建 37 file.mkdirs(); 38 } 39 //将图片保存到本地 40 bitmap.compress(CompressFormat.JPEG, 100, 41 new FileOutputStream(file)); 42 43 44 } catch (Exception e) { 45 // TODO Auto-generated catch block 46 e.printStackTrace(); 47 } 48 49 } 50 51 }
2.在NetCacheUtils (第一次必须从网络中缓存图片)中调用setBitmapTolocal(String url,Bitmap bitmap)方法获取
/**
*
* 从网络下载图片
* @author admin
*
*/
1 public class NetCacheUtils { 2 private LocalCacheUtils mlocalcacheutils; 3 4 5 public NetCacheUtils(LocalCacheUtils localcacheutils, MemoryCacheUtils memorycacheutils) { 6 mlocalcacheutils=localcacheutils; 7 8 } 9 10 public void getBitmapFromNet(ImageView iv_photo, String url) { 11 // TODO Auto-generated method stub 12 BitmapTask bitmaptask=new BitmapTask(); 13 bitmaptask.execute(iv_photo,url);//开启AsyncTask,参数在doInBackground获取 14 } 15 /*AsyncTask 异步任务即做一些简单的异步处理 ;是handle与线程池的封装 16 * 第一个泛型:参数类型泛型 17 * 第二个泛型:更新进度泛型 18 * 第三个泛型:onProgressUpdate的返回结果的泛型 19 * 20 */ 21 22 class BitmapTask extends AsyncTask<Object, Void, Bitmap>{ 23 24 private ImageView pic; 25 private String murl; 26 /** 27 * 后台耗时方法在此执行,子线程 28 */ 29 @Override 30 protected Bitmap doInBackground(Object... params) { 31 pic = (ImageView) params[0]; 32 murl = (String) params[1]; 33 34 pic.setTag(murl);//将图片与url绑定 35 return downloadBitmap(murl); 36 } 37 /** 38 * 更新进度,主线程 39 */ 40 @Override 41 protected void onProgressUpdate(Void... values) { 42 // TODO Auto-generated method stub 43 super.onProgressUpdate(values); 44 } 45 /** 46 * 后台耗时方法结束之后,在此执行,主线程 47 */ 48 @Override 49 protected void onPostExecute(Bitmap result) { 50 if(result!=null){ 51 52 String tag = (String) pic.getTag(); 53 if(tag.equals(murl)){ 54 pic.setImageBitmap(result); 55 } 56 57 } 58 mlocalcacheutils.setBitmapTolocal(murl, result);60 System.out.println("从网络上加载图片啦"); 61 62 } 63 } 64 65 /** 66 * 67 * 下载图片 68 * @return 69 */ 70 private Bitmap downloadBitmap(String url){ 71 HttpURLConnection conn=null; 72 try { 73 conn=(HttpURLConnection) new URL(url) 74 .openConnection(); 75 76 conn.setConnectTimeout(5000); 77 conn.setReadTimeout(5000); 78 conn.setRequestMethod("GET"); 79 conn.connect(); 80 81 int responseCode = conn.getResponseCode();//响应码 82 83 if(responseCode==200){//表示成功连接 84 InputStream inputStream = conn.getInputStream(); 85 Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 86 return bitmap; 87 } 88 89 } catch (IOException e) { 90 91 e.printStackTrace(); 92 } 93 finally{ 94 conn.disconnect(); 95 } 96 return null; 97 98 } 99 }
3.在MyBitMaputils中调用getBitmapFromlocal(url)
1 public class MyBitMaputils { 2 NetCacheUtils netcache; 3 LocalCacheUtils localcacheutils; 4 public MyBitMaputils(){ 5 localcacheutils=new LocalCacheUtils(); 6 netcache=new NetCacheUtils(localcacheutils); 7 8 } 9 10 public void display(ImageView iv_photo, String url) { 11 iv_photo.setImageResource(R.drawable.news_pic_default);//默认图片,防止图片的复用 12 //内存缓存 13 14 //本地缓存 15 Bitmap bitmap = localcacheutils.getBitmapFromlocal(url); 16 if(bitmap!=null){ 17 iv_photo.setImageBitmap(bitmap); 18 System.out.println("从本地读取图片"); 19 return;//从本地读取就不需要从网络读取了 20 } 21 22 //网络缓存(第一次) 23 netcache.getBitmapFromNet(iv_photo,url); 24 }