使用Glide下载图片

Glide是Google官方推荐的图片加载库,既然是Google官方推荐,性能和效率自然不会差,这也是我平常会选择Glide作为首选图片加载库的原因。在实际开发中,有时候我们需要在预览图片的同时,还需要提供图片保存到本地功能,如果你项目使用的是Glide,那么结合Glide实现下载功能就轻而易举了,Glide会优先从缓存中查找图片资源,有缓存直接获取缓存图片,无缓存则从网络下载,简单高效。

原文链接:http://www.jianshu.com/p/c517ae7148f4


  • 既然是图片下载,那么肯定是耗时操作,所以需要要使用到线程。
  • 既然是使用子线程去下载图片,那么我们怎么拿到下载成功或者失败的状态呢?当然是使用接口啦。

一、我们先定义一个接口,代码很简单,就两个方法,成功或者失败的接口回调方法。
public interface ImageDownLoadCallBack {

    void onDownLoadSuccess(File file);

    void onDownLoadFailed();
}

二、实现自己的图片下载线程,一般实现线程的方法有两种,继承Thread和实现Runnable,这里我使用的是Runnable。
public class DownLoadImageService implements Runnable {
    private String url;
    private Context context;
    private ImageDownLoadCallBack callBack;

    public DownLoadImageService(Context context, String url, ImageDownLoadCallBack callBack) {
        this.url = url;
        this.callBack = callBack;
        this.context = context;
    }

    @Override
    public void run() {
        File file = null;
        try {
            file = Glide.with(context)
                    .load(url)
                    .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                    .get();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (file != null) {
                callBack.onDownLoadSuccess(file);
            } else {
                callBack.onDownLoadFailed();
            }
        }
    }

}

小结:
代码很简单,调用Glide下载代码时需要try catch,所以我们的接口回调处理,一定要放在finally方法中,避免catch到异常,回调失败。

三、如何高效的处理下载线程?请看代码
  /**
     * 单线程列队执行
     */
    private static ExecutorService singleExecutor = null;


    /**
     * 执行单线程列队执行
     */
    public void runOnQueue(Runnable runnable) {
        if (singleExecutor == null) {
            singleExecutor = Executors.newSingleThreadExecutor();
        }
        singleExecutor.submit(runnable);
    }

    /**
     * 启动图片下载线程
     */
    private void onDownLoad() {
        DownLoadImageService service = new DownLoadImageService(this,
                "http://pic.sc.chinaz.com/files/pic/pic9/201508/apic14052.jpg",
                new ImageDownLoadCallBack() {

                    @Override
                    public void onDownLoadSuccess(File file) {
                        // 在这里执行图片保存方法
                    }

                    @Override
                    public void onDownLoadFailed() {
                        // 图片保存失败
                    }
                });
        //启动图片下载线程
        runOnQueue(service);
    }

小结:
在实际开发中对于图片的下载,如果按普通的方法处理一般是new Thread(service).start去启用下载线程,但如果是我下载10张图片,每点一次下载就去new一个线程,系统不会实时去回收这些线程,这实际对内存的消耗很大,所以这里用到了线程池管理线程,线程池会对线程进行回收和复用,以更好的优化性能。




  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值