图片加载

本章目录

  • 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还有很多其它复杂的应用就不赘述了,需要的时候现查吧。

你可能感兴趣的:(图片加载)