讓你秒懂的三級快取
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();
}
}