zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    iptables
    apt
    cvc-elt.1: Cannot find the declaration of element 'beans'.
    di
    log
    java内存模型
    spring-jms
    JTS
    10java进阶——IO2
    17单例
  • 原文地址:https://www.cnblogs.com/chenlong-50954265/p/3924594.html
Copyright © 2011-2022 走看看