关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 安卓开发 »Android 平滑图片加载和缓存库 Glide 使用详解

    Android 平滑图片加载和缓存库 Glide 使用详解

    2015-08-26 00:00:00 出处:jcodecraeer
    分享

    在图片加载库烂大街的今天,选择一个适合自己使用的图片加载库已经成为了每一个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() {
                @Override
                    int 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{
        @Override
        public void applyOptions(Context context, GlideBuilder builder) {
            ViewTarget.setTagId(R.id.glide_tag_id);
        }
    
        @Override
        public void registerComponents(Context context, Glide glide) {
    
        }
    }

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

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

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

    <meta-data
        android: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) {
                @Override
                protected void setResource(GlideDrawable resource) {
                    imageViewHolder.image.setImageDrawable(resource);
                }
    
                @Override
                public void setRequest(Request request) {
                    imageViewHolder.image.setTag(i);
                    imageViewHolder.image.setTag(R.id.glide_tag_id,request);
                }
    
                @Override
                public Request getRequest() {
                    return (Request) imageViewHolder.image.getTag(R.id.glide_tag_id);
                }
            });
    
            imageViewHolder.image.setOnClickListener(new View.OnClickListener() {
                @Override
                public 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的库。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    SQL汉字转换为拼音的函数

    windows 7系统无法运行Photoshop CS3的解决方法

    巧用MySQL加密函数对Web网站敏感数据进行保护

    MySQL基础知识简介

    Windows7和WinXP下如何实现不输密码自动登录系统的设置方法介绍

    windows 7系统ip地址冲突怎么办?windows 7系统IP地址冲突问题的

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。