Android 强大的图片加载缓存— Glide
在图片加载库烂大街的今天,选择一个适合自己使用的图片加载库已经成为了每一个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相关推荐
- Android开源框架——图片加载库Glide
Glide是有google开发的图片加载库,支持图片加载与处理,包括动态图片的加载,以及视频的解码. 开源地址:https://github.com/bumptech/glide build.grad ...
- Android中UIL框架特点,聊聊Android优秀的图片加载缓存的开源框架?UIL、Glide、Picasso...
今天总结下有关Android的图片开源框架UIL.Glide.Picasso.当然不止这些还有okhttp.xutlis.afinal.andbase.volley等等,今天主要是对于Glide使用进 ...
- Android应用开发-图片加载库Glide
Glide Picasso和Glide之间的区别: Picasso 仅仅缓存了全尺寸的图像:然而 Glide 缓存了原始图像,全分辨率图像和另外小版本的图像.
- 打造自己的图片加载缓存库(Picasso OR Glide)
好久没写文章了,一个是工作的原因,还一个就是这几个月看了很多文章,一直在补充自己的知识.之前看到一句很喜欢的话--感到快乐就忙东忙西,感到累了就放空自己,这几个月一"快乐"了,就停 ...
- Android图片加载框架——Glide(Glide v4)
原文地址 Android图片加载框架--Glide(Glide v4) 前言 android中图片加载框架有很多,所有框架最终达到的目都是在Android平台上以极度简单的方式加载和展示图片,如果我们 ...
- Android UIL图片加载缓存源码分析-内存缓存
本篇文章我们来分析一下著名图片加载库Android-Universal-Image-Loader的图片缓存源码. 源码环境 版本:V1.9.5 GitHub链接地址:https://github.co ...
- Android之Google推荐的图片加载库Glide介绍
原文链接:Google推荐的图片加载库Glide介绍 作者 : nuuneoi 译者 : jianghejie 校对者 :
- 详谈高大上的图片加载框架Glide -应用篇
在Android设备上,加载网络图片一直是一个头疼的问题,因为Android设备种类繁多(当然最主要的是配置),处理的稍不周到轻则应用卡顿,严重者就会出现OOM的,导致程序挂掉.现如今网络上有很多图片 ...
- 图片加载框架Glide的简单使用
图片加载框架Glide的相关使用 一.搭建环境 1.引入依赖,设置网络权限 implementation 'com.github.bumptech.glide:glide:3.7.0' 代码实现 1. ...
最新文章
- KubeSphere安装Mysql5.7
- 营销推广中心设计(一)营销架构与策略
- UOJ #584. 天天去哪吃
- linux下find命令之-exec ll -sh {} \;
- 自己都不觉得自己值钱,别人怎么觉得你值钱?
- 为什么很多人不跑滴滴了?
- 常见数据平台架构有哪些
- springboot修改项目不需要重启服务器
- C语言海鲜拼盘-01
- dedecms织梦后台模板layui框架-20171126更新
- bzoj 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典【dp】
- Shiro实现logout操作
- 外设驱动库开发笔记33:LCD1602液晶显示屏驱动
- 金融知识小科普 - 央行逆回购
- 教你识别两种PDF密码
- Java 8 腰斩!Java 17 暴涨 430%!!(文末福利)
- 11 | 投简历前为什么要做好目标公司的背调?入坑毁半生
- 【分享】乐才无需代码连接钉钉氚云的方法
- 自媒体入门必备的10个工具,一定要收藏起来
- 关于IP地址与主机名映射的/etc/hosts文件配置
热门文章
- 隆云通聚碳翻斗式雨量传感器
- 实时商业智能BI(二):合理的ETL架构设计实现准实时商业智能BI
- [办公应用]word 2007:全屏快捷键,让复制图片保持原样大小(office 全屏快捷键)...
- 短视频直播平台第三方特效SDK接入教程(完整版)
- 1.计算机发展阶段 计算机发展历史 机械式计算机 机电式计算机 电子计算机 逻辑电路与计算机 二极管 电子管 晶体管 硅 门电路 计算机 电磁学计算机二进制...
- 影响利率风险结构的因素_利率风险结构是什么意思 影响利率的因素
- python docx 字体设置_python docx 中文字体设置
- 揭秘中国网络虚假新闻“制造器”,看传播者如何操纵操纵大众舆论?
- 吴军《智能时代》读书笔记
- 向来有些神秘的ThoughtWorks,突然之间要被Roy卖掉的原因竟然是……