android listview异步加载图片类 (优化)

原创 2013年12月06日 10:40:14
/**
 *
 * <异步加载图片 缓存的实现>
 * <功能详细描述>
 *
 * @author  cyf
 * @version  [版本号, 2013-11-18]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public class AsyncImageLoader
{
    /**
     * 图片缓存
     */
    private HashMap<String, SoftReference<Bitmap>> imageCache;
   
    /**
     * 正在执行下载的url
     */
    private List<String> isDowningUrl;
   
    private Context context;
   
    public AsyncImageLoader(Context context)
    {
        this.context = context;
        imageCache = new HashMap<String, SoftReference<Bitmap>>();
        isDowningUrl = new ArrayList<String>();
    }
   
   /**
    *
    * <先读取缓存中的图片,没有在从本地读,本地没有再去网络下载>
    * <功能详细描述>
    * @param imageUrl
    * @param imageCallback
    * @param zoomForBitmap
    * @return
    * @see [类、类#方法、类#成员]
    */
    public Bitmap loadDrawable(final String imageUrl, final ImageCallback imageCallback, final BitmapSize bitmapSize)
    {
        if (imageUrl != null && imageUrl.length() > 0)
        {
            //先在缓存中查找图片
            if (imageCache.containsKey(imageUrl))
            {
                SoftReference<Bitmap> softReference = imageCache.get(imageUrl);
                Bitmap drawable = softReference.get();
                if (drawable != null)
                {
                    return drawable;
                }
            }
            final Handler handler = new Handler()
            {
                public void handleMessage(Message message)
                {
                    imageCallback.imageLoaded((Bitmap)message.obj, imageUrl);
                }
            };
            //listview上下滑动会重复加载item,重复开线程影响效率
            if (!isDowningUrl.contains(imageUrl))
            {
                new Thread()
                {
                    @Override
                    public void run()
                    {
                        isDowningUrl.add(imageUrl);
                        Bitmap drawable = getBitmap(imageUrl, context);
                        Bitmap nowBitmap = null;
                        if (drawable != null)
                        {
                            //压缩
                            nowBitmap = GeneralUtils.zoomPhoto(drawable, bitmapSize);
                        }
                        if (nowBitmap != null)
                            imageCache.put(imageUrl, new SoftReference<Bitmap>(nowBitmap));
                        isDowningUrl.remove(imageUrl);
                        Message message = handler.obtainMessage(0, nowBitmap);
                        handler.sendMessage(message);
                    }
                }.start();
            }
        }
        return null;
    }
   
    /**
     * 根据网址获得图片,优先从本地获取,本地没有则从网络下载
     *
     * @param url  图片网址
     * @param context 上下文
     * @return 图片
     */
    public static Bitmap getBitmap(String url, Context context)
    {
        String imageName = url.substring(url.lastIndexOf("/") + 1, url.length());
        File file = new File(getPath(context), imageName);
        if (file.exists())
        {
            return BitmapFactory.decodeFile(file.getPath());
        }
        return loadImageFromUrl(url, file, context);
    }
   
    /**
     * 获取图片的存储目录,在有sd卡的情况下为 “/sdcard/本应用包名”
     * 没有sd的情况下为“/data/data/本应用包名/cach/images/”
     *
     * @param context 上下文
     * @return 本地图片存储目录
     */
    private static String getPath(Context context)
    {
        String path = null;
        boolean hasSDCard = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
        String packageName = context.getPackageName() + "/CT/";
        if (hasSDCard)
        {
            path = Environment.getExternalStorageDirectory().getPath() + "/CT/";
        }
        else
        {
            path = "/data/data/" + packageName;
        }
        File file = new File(path);
        if (!file.exists())
        {
            file.mkdirs();
        }
        return file.getPath();
    }
   
    /**
     *
     * <根据URL下载图片,并保存到本地>
     * <功能详细描述>
     * @param imageURL
     * @param context
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static Bitmap loadImageFromUrl(String imageURL, File file, Context context)
    {
        Bitmap bitmap = null;
        try
        {
            URL url = new URL(imageURL);
            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            con.setDoInput(true);
            con.connect();
            if (con.getResponseCode() == 200)
            {
                InputStream inputStream = con.getInputStream();
                ByteArrayOutputStream OutputStream = new ByteArrayOutputStream();
                FileOutputStream out = new FileOutputStream(file.getPath());
                byte buf[] = new byte[1024 * 20];
                int len = 0;
                while ((len = inputStream.read(buf)) != -1)
                {
                    OutputStream.write(buf, 0, len);
                }
                OutputStream.flush();
                OutputStream.close();
                inputStream.close();
                out.write(OutputStream.toByteArray());
                out.close();
                bitmap = BitmapFactory.decodeFile(file.getPath());
            }
        }
        catch (MalformedURLException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return bitmap;
    }
   
    // 回调接口
    public interface ImageCallback
    {
        public void imageLoaded(Bitmap bitmap, String imagePath);
    }
   
    /**
     *
     * <释放缓存>
     * <功能详细描述>
     * @see [类、类#方法、类#成员]
     */
    public void recycleMemory()
    {
        Iterator iter = imageCache.keySet().iterator();
        while (iter.hasNext())
        {
            Object key = iter.next();
            SoftReference<Bitmap> softReference = (SoftReference<Bitmap>)imageCache.get(key);
            Bitmap bitmap = softReference.get();
            if (bitmap != null && !bitmap.isRecycled())
            {
                bitmap.recycle();
            }
        }
        imageCache.clear();
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

【安卓】使用多线程实现ListView中图片的异步加载

ListView中图片的加载问题十分突出,因为程序读取图片资源十分耗时,而如果把设置图片放到主线程中的话,在下滑时会感觉到明显的卡顿,用户体验非常之差。 于是我想到设置图片这一步肯定不能不再主线程中进...
  • jiaomenglei
  • jiaomenglei
  • 2016年08月24日 17:36
  • 1303

android ListView异步加载图片,完美实现图文混排

ListView加载文本数据都是很简单的,即使是异步获取文本数据。但是异步加载图片就稍微有一点麻烦,既要获得一个比较好的用户体验,还要防止出现图片错位等各种不良BUG,其实要考虑的东西还是挺多的。好了...
  • jing__jie
  • jing__jie
  • 2016年08月25日 16:10
  • 794

Android异步加载学习笔记之三:用AsyncTask实现ListView中的图片数据加载

前面的笔记Android异步加载学习笔记之一:用AsyncTask加载服务器json数据和笔记 Android异步加载学习笔记之二:实现ListView中的图片数据从网络加载中有一点小错误,如果给大家...
  • true100
  • true100
  • 2015年08月11日 18:59
  • 883

Listview异步加载图片之优化篇(有图有码有解释)

在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标。关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有b...
  • chaishen10000
  • chaishen10000
  • 2014年03月22日 22:18
  • 3923

深入剖析Android之ListView从网络异步加载图片

深入剖析Android之ListView从网络异步加载图片 我写这篇博客参考了许多文章,其中要重点感谢的是Android ListView从网络获取图片及文字显示和他的英文版文章Android Cu...
  • benbendeda
  • benbendeda
  • 2015年01月26日 22:24
  • 2168

Android ListView异步加载图片时图片顺序混乱解决办法

做项目时ListView中有图片,异步加载了,但是图片顺序混乱了。 解决办法: 给listView中的imageView加上tag. 具体代码如下: imageView.setImageB...
  • qjlhlh
  • qjlhlh
  • 2012年09月14日 14:58
  • 6791

Android之——ListView优化

作为客户端,其最主要的任务就是最直观的和用户交互。从服务器拿数据,解析过后显示数据,根据用户操作按照一定的协议传回数据,达到用户想要的结果。这是我自己的理解,所以我们的程序,必须给用户一个良好的体验。...
  • l1028386804
  • l1028386804
  • 2015年08月02日 18:10
  • 2461

Android性能优化之提高ListView性能的技巧

ListView优化一直是一个老生常谈的问题,不管是面试还是平常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看如何最大化的优化ListView的性能。...
  • nugongahou110
  • nugongahou110
  • 2015年07月29日 15:13
  • 13939

”郭神“---Android ListView异步加载图片乱序问题,原因分析及解决方案

文章地址:http://blog.csdn.net/guolin_blog/article/details/45586553 另外参考笔记:Drawable和Bitmap的区别 原文地址 ...
  • anhenzhufeng
  • anhenzhufeng
  • 2015年08月20日 10:53
  • 714

Android性能优化--listview 优化机制

详情参考:http://www.cnblogs.com/Android-xiansheng/p/4627124.html 首先来了解一下ListView的工作原理(可参见http://mobil...
  • u010921385
  • u010921385
  • 2016年09月04日 22:12
  • 4455
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android listview异步加载图片类 (优化)
举报原因:
原因补充:

(最多只允许输入30个字)