1. 程式人生 > >讓你秒懂的三級快取

讓你秒懂的三級快取



package com.example.sanjidemo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.concurrent.Executors;

import android.annotation.TargetApi;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.LruCache;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;

@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
public class MainActivity extends Activity {

 private LruCache<String, Bitmap> neicun;
 private String sdPath;
 private ArrayList<String> al;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  //建立資料
  al = new ArrayList<String>();

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
    //優化
    if (convertView==null) {
     convertView = new ImageView(MainActivity.this);
    }
    ImageView imageView=((ImageView)convertView);
    imageView.setImageResource(R.drawable.hmn22);
    imageView.setTag(al.get(position));
    try {
     
     sanjihuancun(al.get(position), imageView);
    } catch (Exception e) {
     e.printStackTrace();
    }
    return convertView;
   }

   @Override
   public long getItemId(int position) {
    return position;
   }

   @Override
   public Object getItem(int position) {
    return al.get(position);
   }

   @Override
   public int getCount() {
    return al.size();
   }
  });

 }

 
 // 三級快取  方法
 public Bitmap sanjihuancun(String imagePath, ImageView iv) throws Exception {
  // if(記憶體有圖這張圖片) { return 記憶體的圖片}
  Bitmap bitmap = neicun.get(imagePath);
  System.out.println(neicun.size());
  if (bitmap != null) {
   System.out.println("在記憶體拿的圖片");
   iv.setImageBitmap(bitmap);
   return bitmap;
  }
  // if(SD有圖這張圖片) { return SD的圖片} 存記憶體
  File file = new File(sdPath + "/"
    + URLEncoder.encode(imagePath, "utf-8"));
  if (file.exists()) {
   bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
   System.out.println("在SD拿的圖片");
   neicun.put(imagePath, bitmap);
   iv.setImageBitmap(bitmap);
   return bitmap;
  }
  // 請求網路去拿圖片 存取 sd卡 和 存一份
  gotoNet(imagePath, iv);
  return null;
 }
 //點選清除
 public void click01(View v) {
  try {
   for (String path : al) {
    File file = new File(sdPath + "/"+ URLEncoder.encode(path, "utf-8"));
    if (file.delete()) {
     System.out.println("成功刪除");
    }

   }
  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 //訪問網路載入圖片
 private void gotoNet(final String imagePath, final ImageView iv)
   throws Exception {

  new AsyncTask<Void, Void, Bitmap>() {

   @Override
   protected Bitmap doInBackground(Void... params) {
    // 請求網路
    try {
     HttpURLConnection conn = (HttpURLConnection) new URL(
       imagePath).openConnection();
     conn.setConnectTimeout(5000);
     if (200 == conn.getResponseCode()) {
      InputStream in = conn.getInputStream();
      return BitmapFactory.decodeStream(in);
     }
    } catch (Exception e) {
     e.printStackTrace();
    }
    return null;
   }

   protected void onPostExecute(final Bitmap bitmap) {

    // 給記憶體一份 往集合方一個
    neicun.put(imagePath, bitmap);

    // 給SD卡一份
    try {
     OutputStream stream = new FileOutputStream(new File(sdPath
       + "/" + URLEncoder.encode(imagePath, "utf-8")));
     bitmap.compress(CompressFormat.JPEG, 100, stream);
    } catch (Exception e) {
     e.printStackTrace();
    }
    // 發訊息展示

    runOnUiThread(new Runnable() {
     public void run() {
      System.out.println("在網路拿的圖片");
      
      String tagPath = (String) iv.getTag();
      if (tagPath.equals(imagePath)) {
       iv.setImageBitmap(bitmap);
      }
     }
    });

    /*
     * Message message = Message.obtain(handler, 1, bitmap);
     * handler.sendMessage(message);
     */
   };
  }.execute();
 }

}