本章目录
- 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。
下面来看看具体怎么使用。
- 导包
先在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'
}
- 创建一个类继承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日志标记的警告,该日志标记指示该模块无法找到。
- 生成GlideApp
创建好类后,需要依次点击 Build -> Make Project,这时候会发现自定义的AppGlideModle被注入到GeneratedAppGlideModuleImpl里面。
- 在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还有很多其它复杂的应用就不赘述了,需要的时候现查吧。