使用Glide下载图片
2016-08-15 15:24
441 查看
Glide是Google官方推荐的图片加载库,既然是Google官方推荐,性能和效率自然不会差,这也是我平常会选择Glide作为首选图片加载库的原因。在实际开发中,有时候我们需要在预览图片的同时,还需要提供图片保存到本地功能,如果你项目使用的是Glide,那么结合Glide实现下载功能就轻而易举了,Glide会优先从缓存中查找图片资源,有缓存直接获取缓存图片,无缓存则从网络下载,简单高效。
既然是图片下载,那么肯定是耗时操作,所以需要要使用到线程。
既然是使用子线程去下载图片,那么我们怎么拿到下载成功或者失败的状态呢?当然是使用接口啦。
一、我们先定义一个接口,代码很简单,就两个方法,成功或者失败的接口回调方法。
二、实现自己的图片下载线程,一般实现线程的方法有两种,继承Thread和实现Runnable,这里我使用的是Runnable。
小结:
代码很简单,调用Glide下载代码时需要try catch,所以我们的接口回调处理,一定要放在finally方法中,避免catch到异常,回调失败。
三、如何高效的处理下载线程?请看代码
小结:
在实际开发中对于图片的下载,如果按普通的方法处理一般是new Thread(service).start去启用下载线程,但如果是我下载10张图片,每点一次下载就去new一个线程,系统不会实时去回收这些线程,这实际对内存的消耗很大,所以这里用到了线程池管理线程,线程池会对线程进行回收和复用,以更好的优化性能。
文/馒头先生(简书作者)
原文链接: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一个线程,系统不会实时去回收这些线程,这实际对内存的消耗很大,所以这里用到了线程池管理线程,线程池会对线程进行回收和复用,以更好的优化性能。
文/馒头先生(简书作者)
原文链接:http://www.jianshu.com/p/c517ae7148f4
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
相关文章推荐
- 滚动条右侧定导航
- js 实现 input 文件的内容显示
- [图解tensorflow源码] Graph 图构建 (Graph Constructor)
- 转 内联函数
- 【需求设计1】VIP积分系统无聊YY
- java基础——串行与并行
- 如何实现一个malloc
- 2016.8参靠资料整理
- 双向dp题目
- 测试|版本控制|测试
- 特征向量与特征值(做图像处理项目时所查)
- cpu_freq之注册governor.
- jquery中attr和prop的区别
- [图解tensorflow源码] Graph 图模块 —— Graph Loading
- WCF 发布使用
- configure Git to accept a particular self-signed server certificate for a particular https remote
- 【最小割】BZOJ3894-文理分科
- 索引长度和区分度
- Eclipse编程助手
- centos6关闭selinux和防火墙