图片加载+本地缓冲

来源:互联网 发布:金蝶软件苏州 编辑:程序博客网 时间:2024/05/14 11:29

本文参考自:http://blog.csdn.net/onerain88/article/details/7008409(纠正了原文的小小疏漏和累赘代码)-----大神路过,欢迎指教。微笑


package com.example.net;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;


import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
import android.widget.Toast;


public class loadImage {
/*
* 引用内存缓存
*/
public  static  HashMap<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();
// public static HashMap<String, SoftReference<Bitmap>> imageCache = new
// HashMap<String, SoftReference<Bitmap>>();
private final static String CACHE_PATH = Environment
.getExternalStorageDirectory().getPath() + "/AsyncLoad";


public loadImage() {
System.out.println("path-->" + CACHE_PATH);

}


@SuppressLint("HandlerLeak")
public void loadBitmap(Context context, final ImageView imgView,
final String imgUrl, final ImageCallBack imageCallBack) {


final Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:// 成功
imageCallBack.onSuccess(imgView, (Bitmap) msg.obj);
break;
case 1:
imageCallBack.onFailed(imgView);
break;
default:
break;
}
};
};
// 先去内存的缓冲区寻找
if (imageCache.containsKey(imgUrl)) {
SoftReference<Bitmap> reference = imageCache.get(imgUrl);
Bitmap bitmap = reference.get();
if (null != bitmap) {
Toast.makeText(context, "在 内存 缓存 中找到了~~~~~", 1000).show();


imageCallBack.onSuccess(imgView, bitmap);
return;
}
}
// 再去本地缓存中寻找
String name1 = imgUrl.substring(imgUrl.lastIndexOf("/") + 1);// 截取后面的一段
File cakeDir = new File(CACHE_PATH);
File[] imgs = cakeDir.listFiles();
if (imgs != null) {// 便利查找
int i = 0;
for (; i < imgs.length; i++) {
if (name1.equals(imgs[i].getName()))
break;
}
if (i < imgs.length) {
Toast.makeText(context, "在本地缓存中找到了~~~~~~~", 1000).show();
Bitmap bitmap = BitmapFactory.decodeFile(CACHE_PATH + "/"
+ name1);
imageCallBack.onSuccess(imgView, bitmap);
return;
}
}// end if


// 都 没找到。新启动线程进行下载
new Thread() {
public void run() {
Bitmap bitmap = null;
System.out.println("新启动线程!!!!!!!!!!!!!!!!!!!");
// **********************************
try {
URL url;
url = new URL(imgUrl);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream bitmapIn = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(bitmapIn);
bitmapIn.close();


// 添加内存缓冲区的“软引用”
imageCache.put(imgUrl, new SoftReference<Bitmap>(bitmap));
Message msg = Message.obtain();
msg.obj = bitmap;
msg.what = 0;
handler.sendMessage(msg);
} catch (Exception e) {
Message msg = Message.obtain();
msg.what = 1;
handler.sendMessage(msg);
}// end try catch()
if (bitmap != null) {// 将图片缓存到本地
// 展示略去××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
// * 将图片保存到本地缓存
// */
File dir = new File(CACHE_PATH);
if (!dir.exists()) {
dir.mkdirs();
}
File bitmapFile = new File(CACHE_PATH + "/"
+ imgUrl.substring(imgUrl.lastIndexOf("/") + 1));
if (!bitmapFile.exists()) {
try {
bitmapFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream fos;
try {
fos = new FileOutputStream(bitmapFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// *******************************
System.out.println("run方法 结束了~~~~~~~~~~~~~~~~·");
};
}.start();
}


public interface ImageCallBack {
// 图片加载结束的回调方法
public void onSuccess(ImageView img, Bitmap bm);


public void onFailed(ImageView img);
}
}

//代码中的用法

ImageView img = (ImageView) view.findViewById(R.id.img_bitmap);
loadImage imager = new loadImage();
imager.loadBitmap(context,img, (String) getItem(position), new ImageCallBack() {


@Override
public void onSuccess(ImageView img, Bitmap bm) {
// TODO Auto-generated method stub
img.setImageBitmap(bm);
}


@Override
public void onFailed(ImageView img) {
// TODO Auto-generated method stub
img.setImageResource(R.drawable.ic_launcher);


}
});



0 0
原创粉丝点击