Android图片异步加载
获取图片工具类:
public class ApacheUtility {
/**
  * 获取图片流
  * 
  * @param uri 图片地址
  * @return
  * @throws MalformedURLException
  */
 public static InputStream GetImageByUrl(String uri) throws MalformedURLException {
  URL url = new URL(uri);
  URLConnection conn;
  InputStream is;
  try {
   conn = url.openConnection();
   conn.connect();
   is = conn.getInputStream();
// 或者用如下方法
   // is=(InputStream)url.getContent();
   return is;
  } catch (IOException e) {
   e.printStackTrace();
  }
  return null;
 }
/**
  * 获取Bitmap
  * 
  * @param uri 图片地址
  * @return
  */
 public static Bitmap GetBitmapByUrl(String uri) {
  Bitmap bitmap;  
  InputStream is;
  try {
is = GetImageByUrl(uri);
   bitmap = BitmapFactory.decodeStream(is);
   is.close();
return bitmap;
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return null;
 }
/**
  * 获取Drawable
  * 
  * @param uri  图片地址
  * @return
  */
 public static Drawable GetDrawableByUrl(String uri) {
  Drawable drawable;  
  InputStream is;
  try {
is = GetImageByUrl(uri);
drawable= Drawable.createFromStream(is, "src");
is.close();
return drawable;
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return null;
 }
}
异步任务加载图片类:
/**
  * 异步加载图片
  * 
  */
 public class LoadImageAsyncTask extends AsyncTask<String, Integer, Bitmap> {
  private ImageView imageView;
  @Override
  protected void onPostExecute(Bitmap bitmap) {
   if (null != imageView) {
    imageView.setImageBitmap(bitmap);
   }
  }
  
  // 设置图片视图实例
  public void setImageView(ImageView image) {
   this.imageView = image;
  }
  @Override
  protected Bitmap doInBackground(String... params) {
   Bitmap bitmap = ApacheUtility.GetBitmapByUrl(params[0]); // 调用前面 ApacheUtility 类的方法
   return bitmap;
  }
 }
调用过程如下:
String imgUrl="http://www.streetcar.org/mim/cable/images/cable-01.jpg"; // 图片路径
LoadImageAsyncTask task = new LoadImageAsyncTask();
task.setImageView(iv); // iv为获取的ImageView对象实例
tast.execute(imgUrl); // 执行任务,参数与 doInBackground(String... params) 方法参数一致
异步图片加载类:
参考文章:http://blog.163.com/guozioo@126/blog/static/64086947201136102838503/
public class AsyncImageLoader {
 // SoftReference是软引用,是为了更好的为了系统回收变量
 private HashMap<String, SoftReference<Drawable>> imagesCache;
 public AsyncImageLoader() {
   imagesCache = new HashMap<String, SoftReference<Drawable>>();
 }
 
 public Drawable loadDrawable(final String imageUrl,final ImageView imageView,final ILoadImageCallback callback){
   if(imagesCache.containsKey(imageUrl)){
     // 从缓存中获取
     SoftReference<Drawable> softReference=imagesCache.get(imageUrl);
     Drawable drawable=softReference.get();
     if(null!=drawable){
       return drawable;
     }
  }
  
  final Handler handler=new Handler(){
    public void handleMessage(Message message){
      callback.onObtainDrawable((Drawable)message.obj, imageView);
    }
  };
  //建立一个新的线程下载图片
  new Thread(){
    public void run(){
      Drawable drawable=ApacheUtility.GetBitmapByUrl(imageUrl); // 调用前面 ApacheUtility 类的方法
      imagesCache.put(imageUrl, new SoftReference<Drawable>(drawable));
      Message msg=handler.obtainMessage(0, drawable);
      handler.sendMessage(msg);
    }
  }.start();
   
  return null;
 }
 /**
  * 异步加载图片的回调接口
  */
 public interface ILoadImageCallback {
  public void onObtainDrawable (Drawable drawable, ImageView imageView);
 }
}
调用过程如下:
String imgUrl="http://www.streetcar.org/mim/cable/images/cable-01.jpg"; // 图片路径
AsyncImageLoader imagLoader = new AsyncImageLoader();
Drawable cachedImage= imagLoader.loadDrawable(imgUrl,iv,new ILoadImageCallback(){
public void onObtainDrawable (Drawable drawable, ImageView imageView){
imageView.setImageDrawable(drawable);
}
});
if(null!=cachedImage){
iv.setImageDrawable(cachedImage);
}
类似于上面的另一种实现方式:
public class AsyncImageLoader{
private HashMap<String, Bitmap> imageMap; // 存放图片列表:key-图片路径;value-Bitmap
private Handler handler;
// 构造函数
public AsyncImageLoader(){
imageMap = new HashMap<String, Bitmap>();
handler = new Handler();
}
// 异步加载图片
public void loadImage(final String imageUrl,final ImageView imageView){
    new Thread(new Runnable() {
      public void run() {
        Bitmap image = imageMap.get(imageUrl); // 从缓存中获取数据
        if (image == null) {
image = ApacheUtility.GetBitmapByUrl(imageUrl); // 调用前面 ApacheUtility 类的方法
imageMap.put(status.getId(), image);
}
        final Bitmap bitmap = image;
        handler.post(new Runnable() {
          public void run() {
            imgView.setImageBitmap(bitmap);
          }
        });
      }
    }).start();
}
}
调用过程如下:
String imgUrl="http://www.streetcar.org/mim/cable/images/cable-01.jpg"; // 图片路径
AsyncImageLoader imagLoader = new AsyncImageLoader();
imageLoader.loadImage(imgUrl,iv); // iv为ImageView实例
转自:http://www.cnblogs.com/beijia/archive/2012/05/08/asyncLoad.html 
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号