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

手上的项目使用的图片加载框架是: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 还有1.5.0默认选择是3.8.0的glide 所以改一下3.7.0的引入compile "com.github.bumptech.glide:glide:3.7.0"-》compile "com.github.bumptech.glide:glide:3.8.0"


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

因为Glide本身只负责图片加载,网络请求图片数据由网络框架决定。网络请求一般会有超时的问题,坑的是OKHttp默认的超时时间太短了,如果不修改,网络状态比较差
就很容易请求超时,图片自然就加载不出来。我设置的参数是60,60,30这个可以自己根据实际情况确定。

//这个是源码里面的,默认超时时间,都是10s,10000msconnectTimeout = 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默认图片,长宽小于你加载的图片,不然即使使用的了作者的代码,任然会有变形的问题。




    

更多相关文章

  1. Android 中,应用程序需要的图片资源如何针对不同屏幕大小手机设计
  2. 一款用于在 Android 设备上获取照片(拍照或从相册、文件中选择)、
  3. Android之ListView滚动到底后自动加载数据
  4. Android注解式绑定控件,没你想象的那么难
  5. Android Tween动画之RotateAnimation实现图片不停旋转效果实例介
  6. Android中一张图片占用的内存大小

随机推荐

  1. android之视频播放
  2. 《Android经验分享》周刊第10期
  3. 学习Android到底能赚多少钱?
  4. Android: Binder
  5. Android(安卓)分区挂载
  6. Android跨进程通信-AIDL
  7. Android(安卓)AsyncTask完全解析,带你从源
  8. Android界面布局
  9. [Android] [ANR的原理、分析、实战] 【转
  10. Android之网络请求1————HTTP协议