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();
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

阿里Weex框架快速体验与环境搭建

目录阿里Weex框架快速体验与环境搭建weex sdk集成到Android工程weex服务项目搭建Weex优雅的“降级”到 HTML51. 前言Weex能够完美兼顾性能与动态性,让移动开发者通过简捷的...

android bitmap图片压缩,打时间水印。

public class BitmapUtil {     /**      * 图片大于300k则压缩。      */     private static...

weex项目实战篇(二)

1. 前言经常前面的准备,我们终于可以开始上手weex项目了。2.新建weex项目1)新建一个名为hongkong的项目,如图所示: 2 ) 输入项目名称 3)点击【create】则项目则创建成功...

android机型适配终极篇

一,基本概念1、分辨率,屏幕大小,密度 (1)分辨率。分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏幕常见的分辨率有480×800、720×1280、1080×1920、144...

weex sdk集成到Android工程

1. 前言前面已经介绍了环境搭建跟框架快速体验 ,体验地址,接下来介绍如何集成到自己的项目中。2.前期准备1)已经安装了JDK version>=1.7 并配置了环境变量 2)已经安装Android...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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