Glide的基本使用

PicassoGlide是google推荐的图片加载库(非google官方出品),google首次公开提到它是在泰国举行的谷歌开发者论坛上,它的作者是bumptech。google的好些开源项目也是用的这个图片加载库,像2014年Google I/O大会上发布的官方App。github地址是:https://github.com/bumptech/glide

基本配置

如果大家使用AndroidStudio的话,可以直接compile:

repositories {
  mavenCentral() // jcenter() works as well because it pulls from Maven Central
}

dependencies {
  compile 'com.github.bumptech.glide:glide:3.7.0'
  compile 'com.android.support:support-v4:24.1.0'
}

因为Glide需要依赖Support Library v4,所以别忘了引入。 这个library的版本根据自己情况来定,不是非得24.1.0。

还可以使用maven的方式:

<dependency>
  <groupId>com.github.bumptech.glide</groupId>
  <artifactId>glide</artifactId>
  <version>3.7.0</version>
</dependency>
<dependency>
  <groupId>com.google.android</groupId>
  <artifactId>support-v4</artifactId>
  <version>r7</version>
</dependency>

如果对项目代码进行混淆,则需要添加ProGuard规则:

-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule

使用方法

Glide的基本使用

Glide默认使用HttpUrlConnection进行网络请求,为了让APP保持一致的网络请求形式,可以让Glide使用我们指定的网络请求形式请求网络资源,这里我们选OkHttp

我们只需要一句话(使用链式调用),即可完成异步加载图片:

Glide.with(imageView.getContext()).load(url).into(imageView);

它的load方法提供了四种形式,每个都是返回一个RequestCreator:

  • load(Uri uri)
  • load(String path)
  • load(File file)
  • load(int resourceId)
  • load(byte[] model)
  • load(T model)

从参数我们就可以看出,有的是加载本地的,有的是从网络上取的。其中load的资源可以是本地视频。

Glide加载网络图片

加载网络图片,只需要在load的参数里传入一个url就行:

Glide.with(imageView.getContext())
                 .load(url)
                 .error(R.drawable.photo_holder_72dp)
                 .into(imageView);

error方法设置一个本地图片,当网络加载出错的时候,就会显示这张本地的图片。

清除内存缓存

// 必须在UI线程中调用
    Glide.get(context).clearMemory();

清除磁盘缓存

 // 必须在后台线程中调用,建议同时clearMemory()
   Glide.get(applicationContext).clearDiskCache();

硬盘缓存

  • DiskCacheStrategy.NONE 什么都不缓存,就像刚讨论的那样
  • DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像
  • DiskCacheStrategy.RESULT 仅仅缓存最终的图像,即降低分辨率后的(或者是转换后的)
  • DiskCacheStrategy.ALL 缓存所有版本的图像(默认行为)

优先级

  • Priority.LOW
  • Priority.NORMAL
  • Priority.HIGH
  • Priority.IMMEDIATE
Glide.with(this)
                .load(url)
                .priority(Priority.HIGH)
                .into(mIVTest);

其它用法两者大体相同,可以参考笔者的另一篇文章:
Picasso的基本使用

与Picasso区别

方法区别

通过上面的举例,我们可以看出Glide的用法和Picasso的基本一致,像placeholder、centerCrop等等都有。但也是有一些区别的:

  1. with()方法
    with方法的参数,Glide可以是多种:
    • public static RequestManager with(Context context)
    • public static RequestManager with(Activity activity)
    • public static RequestManager with(FragmentActivity activity)
    • public static RequestManager with(android.app.Fragment fragment)
    • public static RequestManager with(Fragment fragment)

将Activity/Fragment作为with()参数的好处是:图片加载会和Activity/Fragment的生命周期保持一致,比如Paused状态在暂停加载,在Resumed的时候又自动重新加载。

而Picasso只接受Context:
* public static Picasso with(Context context)

  1. crossFade()方法
    Glide带了一个默认动画,即淡入淡出效果,默认300ms,可以传参;而Picasso是没有这个方法的。

  2. animate()方法
    Glide支持自定义动画,而Picasso不提供此方法,它只有一种动画(fading in),要设置动画可以通过类似PicassoDrawable那样设置。

  3. asGif()、asBitmap()方法
    Glide可以加载gif图片,我们可以通过asGif来判断是不是一个gif,如果不是,则走error()的逻辑;如果你加载的是一个gif图片地址,但又只想显示它的第一帧,就可以使用asBitmap()方法。

asGif():

Glide.with(this)
                .load(url)
                .asGif()
                .into(mIVTest);

asBitmap():

Glide.with(this)
                .load(url)
                .asBitmap()
                .into(mIVTest);
  1. skipMemoryCache()方法
    Glide还提供skipMemoryCache()方法跳过内存缓存,但在Picasso中此方法已经被deprecated,建议改成使用MemoryPolicy。

  2. 显示本地视频
    Glide支持加载本地视频,而Picasso不支持。

String filePath = "/storage/emulated/0/Pictures/example_video.mp4";
Glide.with(context).load(Uri.fromFile(new File(filePath)))
.into(mIVVideo);
  1. thumbnail()方法
    Glide提供thumbnail()方法用于产生一个当前所加载图片的thumbnail。

功能区别

  1. 图片质量

    • Glide默认使用RGB_565作为bitmap的格式
    • Picasso则使用ARGB_8888格式,所以质量比Glide好
  2. Glide支持gif动画,而Picasso不支持

  3. glide load方法可以传入空值,而picasso传空参数的话会直接报以下的错误:

Caused by: java.lang.IllegalArgumentException: Path must not be empty.
at com.squareup.picasso.Picasso.load(Picasso.java:297)
at com.meizu.rxjava.example.MainActivity.onCreate(MainActivity.java:21)
at android.app.Activity.performCreate(Activity.java:6378)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1124)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2656)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2774) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1588) 
at android.os.Handler.dispatchMessage(Handler.java:111) 
at android.os.Looper.loop(Looper.java:207) 
at android.app.ActivityThread.main(ActivityThread.java:5955) 
at java.lang.reflect.Method.invoke(Native Method)
  1. Glide还可以将任意本地视频解码成一张静态图片

缓存策略区别

  1. Picasso缓存的是全尺寸的,而Glide缓存的是跟ImageView尺寸相同的。Picasso只缓存一个全尺寸,而Glide会为每种大小的imageview缓存一次。

总结

  • Glide和Picasso在用法上有高度的相似性
  • Glide远比Picasso快,但是需要更大的空间来缓存。
  • Glide加载gif图片的功能和性能不错
  • Glide的with()方法传入Activity 或 Fragment,则图片加载会和它们的生命周期一致,方便管理。

参考

文章目录
  1. 1. 基本配置
  2. 2. 使用方法
    1. 2.1. Glide的基本使用
    2. 2.2. Glide加载网络图片
    3. 2.3. 清除内存缓存
    4. 2.4. 清除磁盘缓存
    5. 2.5. 硬盘缓存
    6. 2.6. 优先级
  3. 3. 与Picasso区别
    1. 3.1. 方法区别
    2. 3.2. 功能区别
    3. 3.3. 缓存策略区别
  4. 4. 总结
  5. 5. 参考
|