在图片加载库烂大街的今天,选择一个适合自己使用的图片加载库已经成为了每一个Android开发者的必经之路。现在市面上知名的图片加载库有UIL,Picasso,Volley ImageLoader,Fresco以及我们今天的主角Glide。它们各有千秋,不能评定谁一定比谁好,只能说哪一个更适合你。

我的理解

下面我来谈一下个人对这些图片加载库的理解,如有错误,还望指教。

Universal Image Loader:一个强大的图片加载库,包含各种各样的配置,最老牌,使用也最广泛。

Picasso: Square出品,必属精品。和OKHttp搭配起来更配呦!

Volley ImageLoader:Google官方出品,可惜不能加载本地图片~

Fresco:Facebook出的,天生骄傲!不是一般的强大。

Glide:Google推荐的图片加载库,专注于流畅的滚动。

更多详情请看stackoverflow上这个问题。

初试Glide

下面进入今天的主题,相信之前很多同学都看到过这篇介绍Glide的文章,中文版在这里。文中从各个方面介绍和比较了Glide与Picasso,总体来说二者极为相似,有着近乎相同的API的使用风格。但Glide在缓存策略和加载GIF方面略胜一筹。最后作者也极力推荐了这个库。

而且据说在Google新出的Photos应用中,到处可见Glide的踪迹。看到这里,你是不是已经迫不及待的想试一试这个库呢?就在你下定决心尝试一记的时候,你又听说Yelp app(据说是美国的大众点评)也在使用这个吊炸天的库。你的心中激动万分,发四一定要使用这个库。说干就干,打开Android Studio,在builde.gradle里面添加上

compile 'com.github.bumptech.glide:glide:3.6.1'

然后全局搜索图片加载的地方,全部换成了下面的代码:

Glide.with(mContext).load(url).placeholder(R.drawable.loading_spinner).crossFade().into(myImageView);

在经过漫长的编译过程之后,再次打开APP,看到有着渐现效果的图片呈现在你的面前,你不禁叫道:“wocao,真TM帅!为什么我以前没有发现呢?”。

不过在你使用了几天之后你会发现一些问题:

为什么 有的图片第一次加载的时候只显示占位图,第二次才显示正常的图片呢?

为什么 我总会得到类似You cannot start a load for a destroyed activity这样的异常呢?

为什么 我不能给加载的图片setTag()呢?

为什么?为什么?这么NB的库竟然会有这么多的问题。没错,这就是我今天要讲的重点。怎么避免上面的问题发生。

一些解决方案

1.如果你刚好使用了这个圆形Imageview库或者其他的一些自定义的圆形Imageview,而你又刚好设置了占位的话,那么,你就会遇到第一个问题。如何解决呢?

方案一: 不设置占位;
方案二:使用Glide的Transformation API自定义圆形Bitmap的转换。这里是一个已有的例子;
方案三:使用下面的代码加载图片:

Glide.with(mContext).load(url) .placeholder(R.drawable.loading_spinner).into(new SimpleTarget<Bitmap>(width, height) {@Override public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {// setImageBitmap(bitmap) on CircleImageView } };

2.至于第二个问题,请记住一句话:不要再非主线程里面使用Glide加载图片,如果真的使用了,请把context参数换成getApplicationContext。更多的细节请参考这个issue。

3.为什么不能设置Tag,是因为你使用的姿势不对哦。如何为ImageView设置Tag呢?且听我细细道来。

方案一:使用setTag(int,object)方法设置tag,具体用法如下:

Java代码是酱紫的:

Glide.with(context).load(urls.get(i).getUrl()).fitCenter().into(imageViewHolder.image);imageViewHolder.image.setTag(R.id.image_tag, i);imageViewHolder.image.setOnClickListener(new View.OnClickListener() {@Overrideint position = (int) v.getTag(R.id.image_tag);Toast.makeText(context, urls.get(position).getWho(), Toast.LENGTH_SHORT).show();}});

同时在values文件夹下新建ids.xml,添加

<item name="image_tag" type="id"/>

大功告成!

方案二:从Glide的3.6.0之后,新添加了全局设置的方法。具体方法如下:

先实现GlideMoudle接口,全局设置ViewTaget的tagId:

public class MyGlideMoudle implements GlideModule{@Overridepublic void applyOptions(Context context, GlideBuilder builder) {ViewTarget.setTagId(R.id.glide_tag_id);}@Overridepublic void registerComponents(Context context, Glide glide) {}
}

同样,也需要在ids.xml下添加id

<item name="glide_tag_id" type="id"/>

最后在AndroidManifest.xml文件里面添加

<meta-dataandroid:name="com.yourpackagename.MyGlideMoudle"android:value="GlideModule" />

又可以愉快的玩耍了,嘻嘻`(∩_∩)′。

方案三:写一个继承自ImageViewTaget的类,复写它的get/setRequest方法。

Glide.with(context).load(urls.get(i).getUrl()).fitCenter().into(new ImageViewTarget<GlideDrawable>(imageViewHolder.image) {@Overrideprotected void setResource(GlideDrawable resource) {imageViewHolder.image.setImageDrawable(resource);}@Overridepublic void setRequest(Request request) {imageViewHolder.image.setTag(i);imageViewHolder.image.setTag(R.id.glide_tag_id,request);}@Overridepublic Request getRequest() {return (Request) imageViewHolder.image.getTag(R.id.glide_tag_id);}});imageViewHolder.image.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int position = (int) v.getTag();Toast.makeText(context, urls.get(position).getWho(), Toast.LENGTH_SHORT).show();}});

一些使用技巧

1.Glide.with(context).resumeRequests()和 Glide.with(context).pauseRequests()

当列表在滑动的时候,调用pauseRequests()取消请求,滑动停止时,调用resumeRequests()恢复请求。这样是不是会好些呢?

2.Glide.clear()

当你想清除掉所有的图片加载请求时,这个方法可以帮助到你。

3.ListPreloader

如果你想让列表预加载的话,不妨试一下ListPreloader这个类。

一些基于Glide的优秀库

1.glide-transformations

一个基于Glide的transformation库,拥有裁剪,着色,模糊,滤镜等多种转换效果,赞的不行不行的~~

2.GlidePalette

一个可以在Glide加载时很方便使用Palette的库。

QQ交流群 :232203809,欢迎入群 
 
微信公众号:终端研发部 
(欢迎关注学习和交流)

Android 强大的图片加载缓存— Glide相关推荐

  1. Android开源框架——图片加载库Glide

    Glide是有google开发的图片加载库,支持图片加载与处理,包括动态图片的加载,以及视频的解码. 开源地址:https://github.com/bumptech/glide build.grad ...

  2. Android中UIL框架特点,聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso...

    今天总结下有关Android的图片开源框架UIL.Glide.Picasso.当然不止这些还有okhttp.xutlis.afinal.andbase.volley等等,今天主要是对于Glide使用进 ...

  3. Android应用开发-图片加载库Glide

    Glide Picasso和Glide之间的区别: Picasso 仅仅缓存了全尺寸的图像:然而 Glide 缓存了原始图像,全分辨率图像和另外小版本的图像.

  4. 打造自己的图片加载缓存库(Picasso OR Glide)

    好久没写文章了,一个是工作的原因,还一个就是这几个月看了很多文章,一直在补充自己的知识.之前看到一句很喜欢的话--感到快乐就忙东忙西,感到累了就放空自己,这几个月一"快乐"了,就停 ...

  5. Android图片加载框架——Glide(Glide v4)

    原文地址 Android图片加载框架--Glide(Glide v4) 前言 android中图片加载框架有很多,所有框架最终达到的目都是在Android平台上以极度简单的方式加载和展示图片,如果我们 ...

  6. Android UIL图片加载缓存源码分析-内存缓存

    本篇文章我们来分析一下著名图片加载库Android-Universal-Image-Loader的图片缓存源码. 源码环境 版本:V1.9.5 GitHub链接地址:https://github.co ...

  7. Android之Google推荐的图片加载库Glide介绍

    原文链接:Google推荐的图片加载库Glide介绍 作者 : nuuneoi 译者 : jianghejie 校对者 :

  8. 详谈高大上的图片加载框架Glide -应用篇

    在Android设备上,加载网络图片一直是一个头疼的问题,因为Android设备种类繁多(当然最主要的是配置),处理的稍不周到轻则应用卡顿,严重者就会出现OOM的,导致程序挂掉.现如今网络上有很多图片 ...

  9. 图片加载框架Glide的简单使用

    图片加载框架Glide的相关使用 一.搭建环境 1.引入依赖,设置网络权限 implementation 'com.github.bumptech.glide:glide:3.7.0' 代码实现 1. ...

最新文章

  1. KubeSphere安装Mysql5.7
  2. 营销推广中心设计(一)营销架构与策略
  3. UOJ #584. 天天去哪吃
  4. linux下find命令之-exec ll -sh {} \;
  5. 自己都不觉得自己值钱,别人怎么觉得你值钱?
  6. 为什么很多人不跑滴滴了?
  7. 常见数据平台架构有哪些
  8. springboot修改项目不需要重启服务器
  9. C语言海鲜拼盘-01
  10. dedecms织梦后台模板layui框架-20171126更新
  11. bzoj 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典【dp】
  12. Shiro实现logout操作
  13. 外设驱动库开发笔记33:LCD1602液晶显示屏驱动
  14. 金融知识小科普 - 央行逆回购
  15. 教你识别两种PDF密码
  16. Java 8 腰斩!Java 17 暴涨 430%!!(文末福利)
  17. 11 | 投简历前为什么要做好目标公司的背调?入坑毁半生
  18. 【分享】乐才无需代码连接钉钉氚云的方法
  19. 自媒体入门必备的10个工具,一定要收藏起来
  20. 关于IP地址与主机名映射的/etc/hosts文件配置

热门文章

  1. 隆云通聚碳翻斗式雨量传感器
  2. 实时商业智能BI(二):合理的ETL架构设计实现准实时商业智能BI
  3. [办公应用]word 2007:全屏快捷键,让复制图片保持原样大小(office 全屏快捷键)...
  4. 短视频直播平台第三方特效SDK接入教程(完整版)
  5. 1.计算机发展阶段 计算机发展历史 机械式计算机 机电式计算机 电子计算机 逻辑电路与计算机 二极管 电子管 晶体管 硅 门电路 计算机 电磁学计算机二进制...
  6. 影响利率风险结构的因素_利率风险结构是什么意思 影响利率的因素
  7. python docx 字体设置_python docx 中文字体设置
  8. 揭秘中国网络虚假新闻“制造器”,看传播者如何操纵操纵大众舆论?
  9. 吴军《智能时代》读书笔记
  10. 向来有些神秘的ThoughtWorks,突然之间要被Roy卖掉的原因竟然是……