一、前言:再优秀的开源库都有坑要填

手上的项目使用的图片加载框架是:Universal-Image-Loader+业务需要定制化的一些代码。Universal-Image-Loader 这个框架是一个非常经典好用的框架,唯一的问题是是作者很久之前就不再更新了。所以综合考虑下,确定使用Glide+封装代替当前的图片加载框架。

二、困惑:

在没有真正使用 Glide 之前,我所看到的文章基本都是赞美这个库的功能强大,加载流畅。然而,当我用上了以后,才发现并不完美。遇到了不少的坑,需要自己填。

2.1 Glide 配合 OKHttp 使用的坑:

需要在Gradle中引入:

compile "com.github.bumptech.glide:glide:3.7.0"

compile "com.github.bumptech.glide:okhttp3-integration:1.4.0@aar"

这里就有一个坑,如果你用到自定义的 GlideModule,这里的可能会失效,被com.github.bumptech.glide:okhttp3-integration:1.4.0@aar默认的替换

解决方法是升级版本号:

compile "com.github.bumptech.glide:okhttp3-integration:1.4.0@aar" -》 compile "com.github.bumptech.glide:okhttp3-integration:1.5.0" 注意,没有@arr

2.2 OKHttpClient 超时设置导致图片无法加载坑:

因为Glide本身只负责图片加载,网络请求图片数据由网络框架决定。网络请求一般会有超时的问题,坑的是OKHttp默认的超时时间太短了,如果不修改,网络状态比较差

就很容易请求超时,图片自然就加载不出来。我设置的参数是60,60,30这个可以自己根据实际情况确定。

//这个是源码里面的,默认超时时间,都是10s,10000ms
connectTimeout = 10_000;
readTimeout = 10_000;
writeTimeout = 10_000; //手动设置超时时间
OkHttpClient client=new OkHttpClient.Builder()
.connectTimeout(HTTP_CONNECT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(HTTP_READ_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(HTTP_WRITE_TIMEOUT, TimeUnit.SECONDS)
.build;

2.3 Glide 查看 log 的坑:

如果你使用 Glide 经常出现图片加载不出来或者加载有问题,你需要查看 Glide 本身的 log,不过这个必须通过 adb 命令开启,详情百度,需要注意如果是请求图片问题,关注请求的 log,图片加载||转换的问题,关注图片加载||转换的log。

2.4 Glide 加载的图片内存占用巨多的坑:

在使用 Glide 的第一个版本,OOM 问题一下子爆炸了,查看内存占用,使用 Universal-Image-Loader 的旧版本,App 占用50m~80m内存,

而使用 Glide 加载列表大图的时候,突然猛增到120M+,低端机器自然很容易就 OOM 了。

Glide 有一个优点被很多人称赞,就是它会根据图片控件的大小对 Bitmap 进程缩放处理,适应控件的大小。

但是,如果是一个控件,在高分屏下,它的控件大小往往比实际图片尺寸大很多,举例一个控件:

长宽:1080400,图片原始尺寸540200,如果不做任何设置,Glide 会把 bitmap 放大到控件大小,那么占用的内存就变成了原始大小四倍。。。

这个是 Glide 的特性,暂时没有找到的方法修改。

临时方案:为了避免Glide自动把bitmap放大,使用在加载图片的时候,使用 .override(width, height) 限制图片的宽高

2.5 Glide 使用过渡动画造成图片变形的 bug

Glide 默认会加载图片的时候会有一个过渡效果,其原理是采用TransitionDrawable实现的。

但是这个和 placeHolder,一起使用,尤其是你的playHolder的尺寸比你加载的图片要大,这个时候就会出现,你加载出来的图片变形的问题。

很多人推荐使用 .dontAnimate() 解决问题,即去掉过渡动画。

但是,如果产品一定需要加入过渡动画,官方其实没有提供完美的解决方案,Glide的作者之一在stackoverflow有回答并且给出了 github 的代码。

http://stackoverflow.com/questions/32235413/glide-load-drawable-but-dont-scale-placeholder

https://github.com/TWiStErRob/glide-support/tree/master/src/glide4/java/com/bumptech/glide/supportapp

注意:我在使用的过程中发现,如果你的ImageView的type是center_crop 的话,那么必须确保你的place_holder默认图片,长宽小于你加载的图片,不然即使使用的了作者的代码,任然会有变形的问题。

Glide填坑指南的更多相关文章

  1. Kubernetes Fluentd+Elasticsearch+Kibana统一日志管理平台搭建的填坑指南

    在初步完成Kubernetes集群架构的建立后,通过搭建一些监控组件,我们已经能够实现 图形化的监控每个node,pod的状态信息和资源情况 通过scale进行replicateSet的扩展和伸缩 通 ...

  2. Flutter 开发填坑指南

    引言 第一次在使用Flutter是在Ubuntu机器上,但是因为Android Studio还有Sdk配置问题,flutter doctor总是在这一步报错...最近又在win10上配了一下环境(真香 ...

  3. Hive 填坑指南

    Hive 填坑指南 目录 Hive 填坑指南 数据表备份 数据表备份 方法1:create table 表名_new as select * from 原表 create table 表名_new a ...

  4. 微信支付中分账功能 填坑指南V1

    公司是做电商的,近期开发了一款小程序,准备线上线下同步销售玩具.这里就涉及到微信支付的功能,网上有很多教程,官方也有文档和Demo,因此微信支付还是比较容易实现的. 由于我们公司是和其他公司合作运营的 ...

  5. Hexo博客skapp主题部署填坑指南

    相信大家都很喜欢 hexo skapp 的主题,由于作者采用结巴分词,加上需要依赖各种各样的环境 所以可能大家踩过很多坑,也许每个人踩得坑不一样,这里使用 Docker 容器 centos 来部署, ...

  6. Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案

    本文为霍格沃兹测试学院学员学习笔记. Python 装饰器简介 装饰器(Decorator)是 Python 非常实用的一个语法糖功能.装饰器本质是一种返回值也是函数的函数,可以称之为“函数的函数”. ...

  7. 首个threejs项目-前端填坑指南

    第一次使用threejs到实际项目中,开始的时候心情有点小激动,毕竟是第一次嘛,然而做着做着就感受到这玩意水好深,满满的都是坑,填都填不过来.经过老板20天惨无人道的摧残,终于小有成就. 因为第一次搞 ...

  8. 首个threejs项目-前端填坑指南【转】

    http://www.cnblogs.com/pursues/p/5226807.html 第一次使用threejs到实际项目中,开始的时候心情有点小激动,毕竟是第一次嘛,然而做着做着就感受到这玩意水 ...

  9. Windows10系统下Hadoop和Hive开发环境搭建填坑指南

    前提 笔者目前需要搭建数据平台,发现了Windows系统下,Hadoop和Hive等组件的安装和运行存在大量的坑,而本着有坑必填的目标,笔者还是花了几个晚上的下班时候在多个互联网参考资料的帮助下完成了 ...

随机推荐

  1. javar入门——基本数据类型

    Java中的数据类型分为两类: 基本数据类型(或者称为原生数据类型) 引用数据类型 基本数据类型 8种:6种基本数据类型,1种字符型,1种布尔型 byte,short,int,long,float,d ...

  2. 698. Partition to K Equal Sum Subsets

    Given an array of integers nums and a positive integer k, find whether it's possible to divide this ...

  3. react.js学习之路二

    看react.js对我来说真的不是难不难的问题,问题是我的思路太难转变了,真是坑死我了,react里面的坑也很多.算了,这些抱怨没啥用,记录一下今天学习的内容. 今天看了to-do-list经典示例 ...

  4. 字符串(tjoi2016,heoi2016,bzoj4556)(sam(后缀自动机)+线段树合并+倍增+二分答案)

    佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为\(n\)的字符串\(s\),和\(m\)个问题.佳媛姐姐必须正确回答这\(m\)个问题, ...

  5. Manacher算法学习笔记

    前言 Manacher(也叫马拉车)是一种用于在线性时间内找出字符串中最长回文子串的算法 算法 一般的查找回文串的算法是枚举中心,然后往两侧拓展,看最多拓展出多远.最坏情况下$O(n^2)$ 然而Ma ...

  6. Django(完整的登录示例、render字符串替换和redirect跳转)

    day61 1. 登录的完整示例                       复习:         form表单往后端提交数据需要注意哪三点:  五一回来默写    <-- 谁写错成from谁 ...

  7. tomcat 项目发布方式

    1.WEB应用的组成结构 开发web应用时,不同类型的文件有严格的存放规则,否则不仅会使web应用无法访问 还会导致web服务器自动报错. mail:web应用所在目录(该目录自定义) html,js ...

  8. springboot入门之简单demo

    项目构建 我们采用maven构建SpringBoot工程,首先创建一个maven工程,对应的pom文件如下: <properties> <java.version>1.8< ...

  9. java.util包详解

    介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构.本章介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结 ...

  10. 位域(bit fields)简介

    使用位域或位操作移动一个字节中的位 Java中EnumSet代替位域代码详解 关于位域的一些东西 深入理解Java枚举类型(enum) 位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个 ...