Yelp是如何通过Glide优化图片加载的

动态加载图片是是很多应用的基础。在yelp,图片是连接消费者和企业的关键。
随着网络和硬件设备的发展,用户对图片质量要求越来越高,数量越来越大。图片很容就
消耗了大量的硬件资源和网络流量,下载和管理这些数据变成了一个很麻烦的问题。
我们尝试了一些现有的解决方案,最终选择了 Glide 这个项目。

在最简单的使用场景中,Glide 会将来自服务器或本地文件的图片加载到磁盘和内存的缓存中,
然后再把它们载入到 view 里。虽然 Glide 适用场景很多, 但它主要致力于优化
带有图片的 scrolling list ,使其尽可能流畅。

对象池

Glide 的核心部分就是维护一个 bitmap 的对象池。对象池通过减少大块对象分配
来提升性能,而不是重用对象。(关于对象池的介绍:this Android performance pattern video )。

目前为止,Dalvik 和 ART 都没有使用压缩垃圾回收机制
(compacting garbage collector),压缩垃圾回收算法会检查 heap,
然后将内存中所有存活对象移到相邻的位置,把大块的可用空间空出来以备后用。
因为 Android 没有采用这套机制,所以内存有可能被各种对象占满,对象间的可用
空间很小。如果应用在这时申请一个比内存里现在最大的空闲块还大的对象,
就会 OutOfMemoryError ,即使剩余内存总和远大于分配这个对象所需的空间。

使用对象池也提升了 list 滚动时的性能,因为重用 bitmaps 就意味着减少了创建和回收对象。
当系统执行垃圾回收时会让整个系统"时间静止",回收器运行时所有的线程(包括 UI 线程)
都会被暂停。这段时间里,动画帧不能绘制,UI 会卡顿,这在滚动动画的过程中会更加明显明显。

img


使用Glide

Glide 上手很容易,不需要任何配置,默认就会使用 bitmap 对象池。

DrawableRequestBuilder requestBuilder = Glide.with(context).load(imageUrl);
requestBuilder.into(imageView);

很简单的两步图片就载入完成了。在 Android 中, with() 方法里传递的 context
可能是 Application 的 context ,也可能是 Activity 的 context。区别这一点很重要,
如果传递的是 Activity 的 context,Glide 会监测 activity 的生命周期,
当 Glide 检测到 Activity 被销毁时, 会自动取消等待中的请求。如果你传递的是一个
Application context,Glide 就不能对其进行优化。

优化特性

和上面一样,当图片从 ListView 中移出屏幕时, Glide 也会取消其对应的请求。
由于大多数开发者在 adapter 中重用 View,Glide 会给在请求数据时给对应的
ImageView 附加一个 tag,然后再载入其他图片时检查这个 tag,
如果存在的话取消第一个请求。

Glide 提供一些特性,可以提升图片加载速度。首先是在图片展示前预读取数据,
它提供了一个 ListPreloader,通过预加载 item 的数量初始化。接着通过
setOnScrollListener(OnScrollListener)ListPreloader 设置给 ListView。如果你想在 ListView 之外预载图片,只要调用上面 DrawableRequestBuilder
对象的 downloadOnly() 方法就好,像这样 builder.downloadOnly();

总之,我们发现了一个强大的工具 Glide。后面都是各种夸 Glide 的话啦~

移动端常见崩溃指标

崩溃分析,是将 Android 和 iOS 平台常见的 APP 崩溃问题进行归类分析,帮助企业根据崩溃指标快速发现、定位问题。

发布于:2天以前  |  44次阅读  |  详细内容 »

Android死锁初探

说到死锁,大家可能都不陌生,每次遇到死锁,总会让计算机产生比较严重的后果,比如资源耗尽,界面无响应等。

发布于:7天以前  |  91次阅读  |  详细内容 »

Android AES加密(Kotlin)

halo~最近工作上写的东西比较简单,感觉分享不出来,最近刚好看到数据加密这一块,感觉挺不错的,也挺好用的,所以下面分享给大家!

发布于:12天以前  |  80次阅读  |  详细内容 »

Android 持续滑动布局 ConsecutiveScrollerLayout 的使用

在开发项目的时候,有时候会遇到一些比较复杂的页面,需要多个不同的列表或者滑动布局、甚至是WebView,组成一个完整的页面。要实现这样一个复杂的页面,在以前我们可能会通过布局嵌套的方式,在一个大的ScrollView下嵌套多个RecyclerView、WebView、ScrollView来实现。但是这种嵌套的方式不仅会严重影响布局的性能,而且处理滑动事件的冲突也是一件头疼的事,处理不好会严重影响用户操作的体验。

发布于:16天以前  |  101次阅读  |  详细内容 »

Android 升级适配爬坑历程

最近接手了一个公司项目,项目比较老了,从Android 5.0之后就再也没有适配过了,然而重写时间又来不及,然后我的爬坑之旅便开始了。(以下适配方案是按照项目需求顺序来的)

发布于:19天以前  |  181次阅读  |  详细内容 »

2020年,一文点破跨平台开发框架现状

多年来,跨平台移动开发已经获得了最流行软件开发趋势之一的声誉。这并不令人意外,因为采用跨平台开发技术使得软件工程师使用同一代码就能为不同平台构建应用程序,从而节省时间、金钱以及不必要的工作。

发布于:1月以前  |  201次阅读  |  详细内容 »

unicode编码在Android中的应用

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。

发布于:2月以前  |  328次阅读  |  详细内容 »

Android动态权限详解

很多App在首次启动时一通弹窗,申请各式各样的权限。后来苹果为改善用户体验,在App Store审核时要求App必须在使用前一刻才能申请权限,有效改善了此类问题。比如一款直播App,当你启动App时并不需要相机、录音权限,等到你开播时才需要申请这两个权限。这一场景,其实就类似今天要提到的Android动态授权。

发布于:2月以前  |  363次阅读  |  详细内容 »

最多阅读

简化Android的UI开发 7月以前  |  192704次阅读
Android设计与开发工作流 7月以前  |  2295次阅读
Google Enjarify:可代替dex2jar的dex反编译 1年以前  |  2290次阅读
Android多渠道打包工具:apptools 1年以前  |  1922次阅读
Android权限 - 第一篇 1年以前  |  1893次阅读
Google Java编程风格规范(中文版) 1年以前  |  1871次阅读
Stetho 1年以前  |  1809次阅读
Android UI基本技术点 1年以前  |  1802次阅读
30分钟搭建一个android的私有Maven仓库 1年以前  |  1765次阅读
2015 Google IO带来的新 Android 开发工具 1年以前  |  1705次阅读
你应该知道的布局和属性 1年以前  |  1652次阅读
听FackBook工程师讲*Custom ViewGroups* 1年以前  |  1649次阅读
MVP在Android平台上的应用 1年以前  |  1633次阅读
Gradle小知识#3:任务的顺序 1年以前  |  1629次阅读