图片加载

本章目录

  • Part One:Picasso,Glide和Fresco对比
  • Part Two:Glide简单应用

图片加载是Android中最基础的功能之一,同时也是最容易造成OOM的起因之一。如果加载的图片过大,或者加载的图片过多,内存溢出就不可避免了。
自从Github上高达1.5W颗星的老牌图片加载第三方# Android-Universal-Image-Loader宣布不再维护之后,当前市面主流的就剩三个:Picasso,Glide和Fresco。

Part One:Picasso,Glide和Fresco对比

先来看一下这三者的一个基本对比

对比项 Picasso Glide Fresco
地址 github.com/square/pica… github.com/bumptech/gl… github.com/facebook/fr…
发布时间 2013年5月 2014年9月 2015年5月
是否支持gif false true true
是否支持webP true true true
视频缩略图 false true true
大小 100k 500 KB 2~3M
加载速度
Disk+Men Cache true true true
Easy of use low mediun difficult
star 13160 14709 12444
开发者 Square主导 Google主导 Facebook主导

尽管从数据统计来看,这三者的功能有所差异,但其实都已基本满足我们开发的需要,用哪个都行。只有极其特殊的情况,才需要择优考虑。
Picasso:如果项目需要使用的图片资源不多可以使用,比如我们一直在讲的案例。

  • 优点:包小,容易使用;
  • 缺点:性能相对差一些

Glide:如果需要大量加载静态图片,不需要加载太多GIF时,可以使用。

  • 优点:包和使用难度都适中,静态图片加载效率好,生命周期集成,内存开销小
  • 缺点:GIF加载慢,没有文件缓存

Fresco:兼容性能不高的手机,还有大批量加载各种类型图片可以使用。

  • 优点:为Android5.0以下的手机单独开辟区域,兼容性好,在native层处理图片,减少OOM
  • 缺点:包大,使用难度大,学习成本高。

Part Two:Glide简单应用

Glide的4.0+版本使用一个注释处理器生成了一个API,允许应用程序访问的所有选项RequestBuilder,RequestOptions以及任何包含集成库在一个流畅的API。
生成的API有两个目的:集成库可以通过自定义选项扩展Glide的API,并且应用程序可以通过添加捆绑常用选项的方法来扩展Glide的API。
尽管这两个任务都可以通过编写RequestOptions的自定义子类来手工完成,但是这样做是具有挑战性的,并且会产生一个不那么流畅的API。
下面来看看具体怎么使用。

  1. 导包
    先在project的build.gradle里面添加仓库地址
repositories {
  mavenCentral()
  maven { url 'https://maven.google.com' }
}

然后添加依赖包即可

dependencies {
  compile 'com.github.bumptech.glide:glide:4.3.1'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.3.1'
}
  1. 创建一个类继承AppGlideModule,并添加注解@GlideModule
package com.terana.customview.tools;

import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;

@GlideModule
public final class MyAppGlideModule extends AppGlideModule{
}

这里需要注意的是,AppGlideModule实现必须始终注释@GlideModule。如果注释不存在,则不会发现该模块,并且您将在日志中看到一条带有Glide日志标记的警告,该日志标记指示该模块无法找到。

  1. 生成GlideApp

创建好类后,需要依次点击 Build -> Make Project,这时候会发现自定义的AppGlideModle被注入到GeneratedAppGlideModuleImpl里面。

  1. 在Adapter中应用GlideApp
GlideApp.with(context).load(bean.getPhotoResId())
                .centerCrop()
                .into(holder.photoImeView);

这里的with:

  • with(Context context). 使用Application上下文,Glide请求将不受Activity/Fragment生命周期控制。
  • with(Activity activity).使用Activity作为上下文,Glide的请求会受到Activity生命周期控制。
  • with(FragmentActivity activity).Glide的请求会受到FragmentActivity生命周期控制。
  • with(android.app.Fragment fragment).Glide的请求会受到Fragment 生命周期控制。
  • with(android.support.v4.app.Fragment fragment).Glide的请求会受到Fragment生命周期控制。

这里的load:
load SD卡资源:load("file://"+Environment.getExternalStorageDirectory().getPath()+"/test.jpg")
load assets资源:load("file:///android_asset/f003.gif")
load raw资源:load("android.resource://com.frank.glide/raw/raw_1")或load("android.resource://com.frank.glide/raw/"+R.raw.raw_1)
load drawable资源:load("android.resource://com.frank.glide/drawable/news")或load("android.resource://com.frank.glide/drawable/"+R.drawable.news)
load ContentProvider资源:load("content://media/external/images/media/139469")
load http资源:load("http://img.my.csdn.net/uploads/201508/05/1438760757_3588.jpg")
load https资源:load("https://img.alicdn.com/tps/TB1uyhoMpXXXXcLXVXXXXXXXXXX-476-538.jpg_240x5000q50.jpg_.webp")

当然,load不限于String类型,还可以:
load(Uri uri)load(File file)load(Integer resourceId)load(URL url)load(byte[] model)load(T model)loadFromMediaStore(Uri uri)。


基本的应用就差不多了,Glide还有很多其它复杂的应用就不赘述了,需要的时候现查吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容