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: }

相关文章: