在Android图片缓存

在Android中经常性的会用到加载图片的问题,那么为了不阻塞主线程,我们首先要考虑异步操作,为了用户更好地体验我们还需要考虑对图片进行缓存。

对图片进行缓存首先要了解softreference<Bitmap>软存储机制,还有就是硬存储的方式在手机端一般就是SD卡的存储。

那么如果当我们进行图片异步加载的时候就需要考虑内存中是否有,如果内存中有的话直接从内存中取出,如果内存中没有的话,再从网上去下载。

判断内存中是否有图片要先从softreference中判断,如果没有就从SD卡中读取,如果两者都没有则从网上下载

ImgLoader.java

  
  
  
  
  1. package com.SQLiteTest;  
  2.  
  3. import java.io.FileInputStream;  
  4. import java.lang.ref.SoftReference;  
  5. import java.util.Map;  
  6. import android.content.Context;  
  7. import android.graphics.Bitmap;  
  8. import android.graphics.BitmapFactory;  
  9. import android.os.Environment;  
  10.  
  11. public class PicManager {  
  12.     private Context context;  
  13.     private Map<String, SoftReference<Bitmap>> imgCache;  
  14.     private FileUtils fUtils=new FileUtils();  
  15.       
  16.     /*  
  17.      * 构造函数  
  18.      */ 
  19.     public PicManager(Context context,  
  20.             Map<String, SoftReference<Bitmap>> imgCache) {  
  21.         super();  
  22.         this.context = context;  
  23.         this.imgCache = imgCache;  
  24.     }  
  25.       
  26.     /*  
  27.      * 先从缓存中读取,如果没有的话从文件读取  
  28.      */ 
  29.       
  30.     public Bitmap getFromCache(String url)  
  31.     {  
  32.         Bitmap bit=null;  
  33.         if(imgCache.containsKey(url))  
  34.         {  
  35.               
  36.             synchronized (imgCache) {  
  37.                 SoftReference<Bitmap> bitReference=imgCache.get(url);  
  38.                 if(bitReference!=null)  
  39.                 {  
  40.                     bit=bitReference.get();  
  41.                 }  
  42.                   
  43.             }  
  44.               
  45.         }  
  46.         else {  
  47.             bit=getFromSDcard(url);  
  48.             imgCache.put(url, new SoftReference<Bitmap>(bit));  
  49.         }  
  50.         return bit;  
  51.     }  
  52.       
  53.     private Bitmap getFromSDcard(String url)  
  54.     {  
  55.           
  56.         Bitmap bitmap=null;  
  57.           
  58.         String filename=fUtils.getFName(url);  
  59.               
  60.         System.out.println("PicManager-->"+filename);  
  61.         String path=Environment.getExternalStorageDirectory()+"/";  
  62.         try {  
  63.               FileInputStream fis=context.openFileInput(path+"picture/"+filename);  
  64.             //FileInputStream fis=new FileInputStream(path+"picture"+filename);  
  65.             bitmap=BitmapFactory.decodeStream(fis);  
  66.             fis.close();  
  67.         } catch (Exception e) {  
  68.             // TODO Auto-generated catch block  
  69.             e.printStackTrace();  
  70.         }  
  71.         return bitmap;  
  72.     }  
  73. }  

 

PicManager.java

  
  
  
  
  1. package com.SQLiteTest;  
  2.  
  3. import java.lang.ref.SoftReference;  
  4. import java.util.HashMap;  
  5. import java.util.Map;  
  6. import java.util.concurrent.ExecutorService;  
  7. import java.util.concurrent.Executors;  
  8.  
  9. import android.content.Context;  
  10. import android.graphics.Bitmap;  
  11. import android.graphics.BitmapFactory;  
  12. import android.os.Handler;  
  13.  
  14. public class ImgLoader {  
  15.       
  16.     private Context context;  
  17.     final  Map<String, SoftReference<Bitmap>> imgCache=  
  18.             new HashMap<String, SoftReference<Bitmap>>();  
  19.                           
  20.     public ImgLoader(Context context) {  
  21.         super();  
  22.         this.context = context;  
  23.     }  
  24.       
  25.     private Handler mhandler=new Handler();  
  26.     private PicManager pm=new PicManager(context, imgCache);  
  27.     private FileUtils fuUtils=new FileUtils();  
  28.     private ExecutorService threadPool=Executors.newFixedThreadPool(5);  
  29.     private DownLoad dl=new DownLoad();  
  30.       
  31.     public Bitmap loadImg(final String url,final ImgCallBack callBack)  
  32.     {  
  33.         Bitmap bitmap=null;  
  34.         try {  
  35.               
  36.             bitmap=pm.getFromCache(url);  
  37.             System.out.println("ImgLoader--->执行???  ");  
  38.             if(bitmap==null)  
  39.             {  
  40.                 System.out.println("ImgLoader--->什么时候执行");  
  41.                 threadPool.submit(new Runnable() {  
  42.                       
  43.                     @Override 
  44.                     public void run() {  
  45.                         // TODO Auto-generated method stub  
  46.                         String fname=fuUtils.getFName(url);  
  47.                           
  48.                         dl.download(url,"picture/", fname);  
  49.                         final Bitmap bit=BitmapFactory.decodeStream(dl.getInput(url));  
  50.                         //imgCache.put(url,new SoftReference<Bitmap>(bit));  
  51.                         mhandler.post(new Runnable() {  
  52.                               
  53.                             @Override 
  54.                             public void run() {  
  55.                                 // TODO Auto-generated method stub  
  56.                                   
  57.                                 callBack.refresh(bit);  
  58.                             }  
  59.                         });  
  60.                     }  
  61.                       
  62.                       
  63.                 });  
  64.             }  
  65.         } catch (Exception e) {  
  66.             // TODO: handle exception  
  67.         }  
  68.           
  69.         return bitmap;  
  70.     }  
  71.       
  72. }  

DownLoad.java

 

  
  
  
  
  1. package com.SQLiteTest;  
  2.  
  3. import java.io.InputStream;  
  4. import java.net.HttpURLConnection;  
  5. import java.net.URL;  
  6.  
  7. public class DownLoad {  
  8.       
  9.       
  10.     public void download(String url,String path,String filename)  
  11.     {  
  12.         FileUtils fUtils=new FileUtils();  
  13.         InputStream input=null;  
  14.           
  15.         if(!fUtils.isExist(filename))  
  16.         {  
  17.             try   
  18.             {  
  19.                 input=getInput(url);  
  20.                 System.out.println("DownLoad--->"+input);  
  21.                 fUtils.write2SDCARD(path, filename, input);  
  22.                   
  23.             } catch (Exception e) {  
  24.                 // TODO Auto-generated catch block  
  25.                 e.printStackTrace();  
  26.             }  
  27.           
  28.               
  29.         }  
  30.           
  31.           
  32.     }  
  33.       
  34.     public InputStream getInput(String urlstr)   
  35.     {  
  36.         URL url=null;  
  37.         InputStream input=null;  
  38.         try {  
  39.             url = new URL(urlstr);  
  40.             HttpURLConnection hul=(HttpURLConnection)url.openConnection();  
  41.             input=hul.getInputStream();  
  42.         } catch (Exception e) {  
  43.             // TODO Auto-generated catch block  
  44.             e.printStackTrace();  
  45.         }  
  46.           
  47.         return input;  
  48.     }  
  49. }  

FileUtilts.java

 

  
  
  
  
  1. package com.SQLiteTest;  
  2.  
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.io.InputStream;  
  6. import java.io.OutputStream;  
  7.  
  8. import android.os.Environment;  
  9.  
  10. public class FileUtils {  
  11.       
  12.     private String SDPATH=Environment.getExternalStorageDirectory()+"/";  
  13.       
  14.     public File creaPath(String path)   
  15.     {  
  16.         File file=new File(SDPATH+path);  
  17.         file.mkdir();  
  18.         return file;  
  19.     }  
  20.       
  21.     public File creaFile(String fileName) throws Exception  
  22.     {  
  23.         File f=new File(SDPATH+fileName);  
  24.         f.createNewFile();  
  25.         return f;  
  26.     }  
  27.       
  28.     public boolean isExist(String Filename)  
  29.     {  
  30.         File f=new File(SDPATH+Filename);  
  31.         return f.exists();  
  32.     }  
  33.       
  34.     public void write2SDCARD(String path,String filename,InputStream input)  
  35.     {  
  36.           
  37.         try {  
  38.             creaPath(path);  
  39.             File file =creaFile(path+filename);  
  40.               
  41.             OutputStream output=new FileOutputStream(file);  
  42.             byte[] buffer=new byte[4*1024];  
  43.             int line=0;  
  44.             while((line=input.read(buffer))!=-1)  
  45.             {  
  46.                 output.write(buffer,0, line);  
  47.                   
  48.             }  
  49.             output.flush();  
  50.             output.close();  
  51.               
  52.         } catch (Exception e) {  
  53.             // TODO Auto-generated catch block  
  54.             e.printStackTrace();  
  55.         }  
  56.           
  57.     }  
  58.       
  59.     public String getFName(String url)  
  60.     {  
  61.         int start=url.lastIndexOf("/");  
  62.           
  63.         String str=url.substring(start);  
  64.         return str;  
  65.     }  
  66.       
  67.       
  68. }  

ImgCallBack.java

这是个接口主要负责刷新Bitmap

  
  
  
  
  1. package com.SQLiteTest;  
  2.  
  3. import android.graphics.Bitmap;  
  4.  
  5. public interface ImgCallBack {  
  6.       
  7.     public void refresh(Bitmap bitmap);  
  8.       
  9. }  

你可能感兴趣的:(android,图片缓存)