• ListView与GridView异步加载图片


    原理很简单,主要是用到了回调方法,下面是异步加载图片的类

    <span style="font-size:16px;">package com.xxx.xxx;

    import java.io.InputStream; import java.lang.ref.SoftReference; import java.net.URL; import java.util.HashMap;

    import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message;

              /**  * 图片异步加载  *  */

           public class AsyncImageLoader {

                        private HashMap<String, SoftReference<Drawable>> imageCache;

                        public AsyncImageLoader() {   imageCache = new HashMap<String, SoftReference<Drawable>>();

           }

             /**   * 加载drawable,读取到drawable后用hashmap存起来,以图片地址为key,这样在重复加载的时候就可以直接取值了

            *   * @param imageUrl   * @param imageCallback   * @return drawable   */

            public Drawable loadDrawable(final String imageUrl,    final ImageCallback imageCallback) {  

                         if (imageCache.containsKey(imageUrl)) {    

                                SoftReference<Drawable> softReference = imageCache.get(imageUrl);

                                Drawable drawable = softReference.get();

                         if (drawable != null) {   

                               return drawable;   

                                                     }   

                         }

                     final Handler handler = new Handler() {

                              public void handleMessage(Message message) {     

                             imageCallback.imageLoaded((Drawable) message.obj, imageUrl);

                            }

                     };  

                    new Thread() {  

                           @Override    public void run() {    

                           Drawable drawable = loadImageFromUrl(imageUrl);   

                           imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));   

                          Message message = handler.obtainMessage(0, drawable);    

                          handler.sendMessage(message);  

                            }  

                   }.start();   return null;

                  }

               /**   * @param strUrl   * @return drawable   */

             private static Drawable loadImageFromUrl(String strUrl) {  

                       URL url;   InputStream i = null;  

                       try {    url = new URL(strUrl);

                                   i = (InputStream) url.getContent();

                             } catch (Exception e) {  

                                   e.printStackTrace();  

                            }   

                       Drawable d = Drawable.createFromStream(i, "src");

                                 return d;

                         }

            public interface ImageCallback {

                         /** 这个接口用来实现回调    * @param imageDrawable    * @param imageUrl    */   

             public void imageLoaded(Drawable imageDrawable, String imageUrl);

                }

    }</span>

    这个类用到了SoftReference软引用,在内存不足的情况下自动释放缓存,不至于在加载图片过多的时候产生内存泄露。

    然后自定义的Adapter的getView方法中这样加载图片:

    <span style="font-size:16px;"></span>

    <span style="font-size:16px;">

    Drawable cachedImage = imageLoader.loadDrawable(AppMessageUrl.IMAGEURL     + iconUrl, new ImageCallback() {  

                     public void imageLoaded(Drawable imageDrawable, String imageUrl) {    

                                     holder.imageView.setImageDrawable(imageDrawable);   

                                 }  

                      });  

                      if (cachedImage == null) {   

                                   holder.imageView.setImageResource(R.drawable.no_apk);   //在图片没有读取出来的情况下预先放一张图

                    } else {    holder.imageView.setImageDrawable(cachedImage);

                   }</span>

    作者:-xu 邮箱:860072925@qq.com QQ群:IOS/Android 25961346
  • 相关阅读:
    交叉工具链的搭建方法(测试成功)
    使用samba实现linux与windows共享(测试成功)
    sd卡脱机烧写系统的方法(测试成功)
    Navicat连接SQLServer未发现数据源名并且未指定默认驱动程序
    使用docker rmi 批量删除docker镜像
    删除镜像docker rmi IMAGE ID提示image is referenced in multiple repositories
    Linux下,改过/etc/profile文件导致ls vi等命令不能使用解决方法
    安装openssl-dev 报错E: Unable to locate package openssl-dev
    zabbix监控redis命中率---张庆沉笔记
    布局之BFC
  • 原文地址:https://www.cnblogs.com/qiaoxu/p/3861839.html
Copyright © 2020-2023  润新知