asdasdasdasdasdsa
class AsyncImageLoader {
2:
//图片缓存(此处软引用,这样虚拟机只会在内存不足的时候才会回收此对象)
4: HashMap<String, SoftReference<Drawable>> imgCache;
5:
public AsyncImageLoader(){
7:
new HashMap<String, SoftReference<Drawable>>();
9:
10: }
/**
*
* @param url
* 要下载图片的url路径
* @param imageView
* 图片要显示在的ImageView
* @param imageDownloadCallBack
* 下载完成后执行的回调函数
* @return
*/
final ImageDownloadCallBack imageDownloadCallBack){
22:
//先判断缓存中是否已有下载好的图片
if(imgCache.containsKey(url) == true){
25:
return imgCache.get(url).get();
27:
28: }
29:
30:
//如果缓存没有则需要开线程进行异步下载
32:
new Handler(){
34:
35: @Override
void handleMessage(Message msg) {
37:
//获取message中保存的下载好的Drawable
39: Drawable downloadedDrawable = (Drawable)msg.obj;
//执行回调函数
41: imageDownloadCallBack.downloaded(url, downloadedDrawable, imageView);
42:
43: }
44:
45:
46: };
47:
//新开一个线程负责下载图片
new Runnable() {
50:
void run() {
52:
53: Drawable drawable = downloadDrawable(url);
//缓存下载后的图片
new SoftReference<Drawable>(drawable));
56:
57: Message message = handler.obtainMessage();
58: message.obj = drawable;
59: handler.sendMessage(message);
60:
61: }
62: });
63:
64:
return null;
66: }
67:
68:
69:
//定义一个回调接口
interface ImageDownloadCallBack{
72:
void downloaded(String imgURL,Drawable downloadedDrawable,ImageView imageView);
74:
75: }
76:
77:
//下载图片
private Drawable downloadDrawable(String imgURL){
80:
81: Drawable drawable = null;
try {
new URL(imgURL);
);
catch (MalformedURLException e) {
86:
87: e.printStackTrace();
88:
catch (IOException e) {
90: e.printStackTrace();
91: }
92:
return drawable;
94: }
95:
96:
97:
98: }
使用:
创建一个Adapter,在getView()方法中进行调用
extends BaseAdapter{
2:
//代码部分省略
4:
int position, View convertView, ViewGroup parent) {
6:
;
8: ImageView imageView = null;
9:
new AsyncImageLoader();
11:
new AsyncImageLoader.ImageDownloadCallBack() {
13:
void downloaded(String imgURL, Drawable downloadedDrawable,
15: ImageView imageView) {
16:
//此处的downloadedDrawable 是通过线程下载的图片
if(downloadedDrawable!=null){
19:
20: imageView.setImageDrawable(downloadedDrawable);
21:
22: }
23:
24: }
25: });
26:
27:
//说明此图片已被下载并缓存
if(cachedDrawable != null){
30:
31: imageView.setImageDrawable(cachedDrawable);
32:
33: }
34:
35:
36:
37:
return null;
39: }
40:
41:
42: }