[转]Android图片异步加载

落爺英雄遲暮 提交于 2020-04-07 13:18:24

获取图片工具类:

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实例

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!