Glide是Google官方推荐的图片加载库,既然是Google官方推荐,性能和效率自然不会差,这也是我平常会选择Glide作为首选图片加载库的原因。在实际开发中,有时候我们需要在预览图片的同时,还需要提供图片保存到本地功能,如果你项目使用的是Glide,那么结合Glide实现下载功能就轻而易举了,Glide会优先从缓存中查找图片资源,有缓存直接获取缓存图片,无缓存则从网络下载,简单高效。
既然是图片下载,那么肯定是耗时操作,所以需要要使用到线程。既然是使用子线程去下载图片,那么我们怎么拿到下载成功或者失败的状态呢?当然是使用接口啦。
一、我们先定义一个接口,代码很简单,就两个方法,成功或者失败的接口回调方法。
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
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
转载请注明原文地址: https://ju.6miu.com/read-1302999.html