Android 그림 의 3 급 캐 시 메커니즘 인 스 턴 스 분석

Android 그림 의 3 급 캐 시 메커니즘 인 스 턴 스 분석
우리 가 그림 을 가 져 올 때 그림 의 캐 시 를 잘 조율 하지 않 으 면 대량의 데이터,유 료 데이터 응용 을 초래 하고 사용자 의 체험 이 좋 지 않 으 며 후기 발전 에 영향 을 줄 수 있다.이 를 위해 저 는 안 드 로 이 드 이미지 의 3 급 캐 시 체 제 를 공유 하여 네트워크 에서 그림 을 가 져 와 응용 을 최적화 시 키 고 구체 적 으로 3 단계 로 나 누 어 진행 합 니 다.
(1)캐 시 에서 그림 가 져 오기
(2)로 컬 캐 시 디 렉 터 리 에서 그림 을 가 져 오고 가 져 온 후 캐 시 에 넣 습 니 다.
(3)인터넷 에서 그림 을 다운로드 하고 다운로드 가 완료 되면 로 컬 에 저장 하고 캐 시 에 저장 합 니 다.
이 3 층 이미지 캐 시 를 잘 조율 하면 응용 성능 과 사용자 체험 을 크게 향상 시 킬 수 있다.
3 급 캐 시 를 빠르게 실현 하 는 도구 류 ImageCacheUtil 은 다음 과 같다.
1.네트워크 에서 그림 을 가 져 오 는 3 급 캐 시 도구 류 ImageCacheUtil

public class ImageCacheUtil {
  private LruCache<String, Bitmap> lruCache;
  private File cacheDir;
  private ExecutorService newFixedThreadPool;
  private Handler handler;
  public static final int SUCCESS = 100;
  public static final int FAIL = 101;
  //          ,   
  //1.        
  //2.             ,       ,     
  //3.        ,      ,               
  public ImageCacheUtil(Context context,Handler handler){
    //       
    int maxsize = (int) (Runtime.getRuntime().maxMemory()/8);
    //maxSize :          
    lruCache = new LruCache<String, Bitmap>(maxsize){
      //             ,        ,                  
       @Override
      protected int sizeOf(String key, Bitmap value) {
         //            
         //getRowBytes :             
         //getHeight :          
        return value.getRowBytes()*value.getHeight();
      }
    };
    //      
    cacheDir = context.getCacheDir();
    //     
    //nThreads :          
    newFixedThreadPool = Executors.newFixedThreadPool(5);
    this.handler = handler;
  }
  /**
   *        
   * @param url
   * @param positon
   * @return
   */
  public Bitmap getBitmap(String url,int position){
    Bitmap bitmap = null;
    //1.         (LRUCache<k,v>) k:key        ,       url  ,v:value   
    bitmap = lruCache.get(url);//  key           
    //lruCache.put(url, bitmap):        
    if (bitmap!=null) {
      return bitmap;
    }
    //2.             ,       ,     
    bitmap = getFromLocal(url);
    if (bitmap!=null) {
      return bitmap;
    }
    //3.        ,      ,               
    getFromNet(url,position);
    return null;
  }
  /**
   *        ,    ,   
   * @param url
   * @param position
   */
  private void getFromNet(String url, int position) {
    newFixedThreadPool.execute(new RunnableTask(url,position));
  }
  class RunnableTask implements Runnable{
    private String imageUrl;
    private int position;
    public RunnableTask(String url,int position){
      this.imageUrl = url;
      this.position = position;
    }

    @Override
    public void run() {
      Message message = Message.obtain();
      //    
      try {
        URL url = new URL(imageUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(3000);
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        InputStream inputStream = conn.getInputStream();
        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
        //        
        wirteToLocal(imageUrl, bitmap);
        //        
        lruCache.put(imageUrl, bitmap);
        //    , handler    
        message.what = SUCCESS;
        message.obj = bitmap;
        message.arg1 = position;
        handler.sendMessage(message);
        return;
      } catch (Exception e) {
        e.printStackTrace();
      }
      message.what = FAIL;
      handler.sendMessage(message);
    }
  }
  /**
   *            
   * @param url
   */
  private Bitmap getFromLocal(String url) {
    //           
    try {
      String fileName = MD5Encoder.encode(url).substring(10);
      File file = new File(cacheDir, fileName);
      Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
      //      
      lruCache.put(url, bitmap);
      return bitmap;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }
  /**
   *              
   */
  public void wirteToLocal(String url,Bitmap bitmap){
    //url  ,  MD5  ,     10     
    try {
      String fileName = MD5Encoder.encode(url).substring(10);
      File file = new File(cacheDir, fileName);
      FileOutputStream out = new FileOutputStream(file);
      //format :     (android   png ,  png        )
      //quality :     
      //stream :    
      bitmap.compress(CompressFormat.JPEG, 100, out);//          
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}

MD5Encoder 클래스 는 다음 과 같 습 니 다.

public class MD5Encoder {

  public static String encode(String string) throws Exception {
    byte[] hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));
    StringBuilder hex = new StringBuilder(hash.length * 2);
    for (byte b : hash) {
      if ((b & 0xFF) < 0x10) {
        hex.append("0");
      }
      hex.append(Integer.toHexString(b & 0xFF));
    }
    return hex.toString();
  }
}

2.MainActivity 에서 imageCacheUtil 초기 화

ImageCacheUtil imageCacheUtil = new ImageCacheUtil(getApplicationContext, handler);
3.MainActivity 에서 handler 를 통 해 그림 보이 기
그림 은 도구 류 를 통 해 다운로드 에 성공 한 후 로 컬 캐 시 와 시스템 캐 시 에 그림 을 저장 해 야 할 뿐만 아니 라 그림 도 표시 해 야 합 니 다.handler 를 통 해 처리 합 니 다.이 handler 는 ImageCacheUtil 도구 류 를 사용 하 는 설정 이 므 로 handler 를 전달 하여 해당 하 는 ImageCacheUtil 도구 류 를 사용 하 는 클래스 에 메 시 지 를 전달 하 는 데 편리 합 니 다.

private Handler handler = new Handler(){
  public void handleMessage(android.os.Message msg) {
    switch (msg.what) {
    case ImageCacheUtil.SUCCESS:
      //       
      Bitmap bitmap = (Bitmap) msg.obj;
      int position = msg.arg1;
      ImageView image= (ImageView) view.findViewWithTag(position);//                
      if (image != null && bitmap != null) {
        image.setImageBitmap(bitmap);
      }
      break;
    case ImageCacheUtil.FAIL:
      Toast.makeText(getApplicationContext, "      ", 0).show();
      break;
    }
  };
};
4.MainActivity 의 adapter getview 에서 호출

Bitmap bitmap = imageCacheUtil.getBitmap(list.get(position).listimage, position);
if (bitmap != null) {
  viewHodler.image.setImageBitmap(bitmap);
}

읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기