Android图片加载框架Glide源码解析(一)

Glide的基本使用

说到现下Android开发中热门的第三方框架,就会谈到图片加载框架Glide这个框架,在大部分的APP开发中都会有Glide的影子,为什么Glide被广泛使用呢?Glide官方文档是这样描述的:

Glide是一个快速高效的Android图片加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。
Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。Glide的Api是如此的灵活,开发者甚至可以插入和替换成自己喜爱的任何网络栈。默认情况下,Glide使用的是一个定制化的基于HttpUrlConnection的栈,但同时也提供了与Google Volley和Square OkHttp快速集成的工具库。
虽然Glide 的主要目标是让任何形式的图片列表的滚动尽可能地变得更快、更平滑,但实际上,Glide几乎能满足你对远程图片的拉取/缩放/显示的一切需求。

那么Glide在我们开发中究竟是怎么样使用的呢?

1、使用要求

Min Sdk Version - 使用 Glide 需要 min SDK 版本 API 14 或更高。
Compile Sdk Version - Glide 必须使用 API 27或更高版本的 SDK 来编译。
Support Library Version - Glide 使用的支持库版本为 27。

2、Glide库的引入

Android studio中Gradle配置:
在root的build.gradle中增加下面配置,从maven仓库中引入:

repositories {
     mavenCentral()
     maven { url 'https://maven.google.com' }
}

并在app的build.gradle中增加对glide的依赖,配置如下:

dependencies {
     implementation 'com.github.bumptech.glide:glide:4.7.1'
}

注: 如果你需要使用不同的支持库版本,你需要在你的 build.gradle 文件里去从 Glide 的依赖中去除 "com.android.support",例如:

dependencies {
    implementation ("com.github.bumptech.glide:glide:4.7.1") {
        exclude group: "com.android.support"
    }
    implementation "com.android.support:support-fragment:26.1.0"
}

3、Glide加载图片基本方式

特别说明:Glide 现在最新版是v4,与之前的v3版本在使用上有比较大的差异,主要改动是Glide库处理选项(centerCrop(), placeholder() 等)的方式,V4版本增加RequestOptions类处理选项。因此在本文中主要V4版本的用法。

1.简单常用的方式

使用Glide加载图片很简单,一行代码足以:

String myUrl = "http://img.zcool.cn/community/0117e2571b8b246ac72538120dd8a4.jpg@1280w_1l_2o_100sh.jpg";
ImageView imageView = (ImageView)findViewById(R.id.iv_background);
Glide.with(fragment)
.load(myUrl)    //myurl表示图片的url地址
.into(imageView);//imageView表示加载的图片要显示在imageView上

既然有加载,就有相应的取消加载方式,同样很简单:

Glide.with(context).clear(imageView); // 取消加载图片

注:尽管及时的取消不必要的加载是很好的实践,但不是必须的操作。因为在实际中的Activity、Fragment在实例销毁的时候,Glide自身会自动取消加载。

2.使用注解处理器的方式

这种方式时使用注解的方式,实现的。在使用注解方式,务必要在App的build.gradle的dependencies中引入下:

annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'

在Application模块中,通过创建一个带有@GlideModule注解,并继承AppGlideModule的类。这个类能够生成一个流式API,内嵌了多种选项,如下:

package com.example.myapp;

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

@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}

通过编译就好生成一个默认名称为GlideApp的类,在Application中就可以按下方式使用来完成加载图片功能:

RequestOptions options = new RequestOptions();
options.placeholder(placeholder)
            .fitCenter();
GlideApp.with(fragment)
   .load(myUrl)
   .apply(options)
   .into(imageView);

4、Glide的其他设置

1.占位图设置

在实际图片的加载过程中,会经常出现图片加载缓慢的问题,这个时候需要展示该图片的位置就显示了一片空白,体验效果很不友好,因此Glide提供了占位图,可以预设置一个默认的图片,在实际的图片未加载完成时,显示这个默认图片,提高用户体验。使用方式如下:

//通过使用RequestOptions去设置占位图及加载错误时显示图
RequestOptions options = new RequestOptions();
options.placeholder(R.drawable.ic_default) //这里设置占位图
            .error(R.drawable.ic_error) ;//这里设置图片加载错误时要显示的图
Glide.with(activity)
    .load(url)
    .apply(options)            
    .into(imageView);

placeholder()和error()参数都是int类型,即使用本地资源对应的id,可能主要考虑到加载速度快。

2.缩略图

设置缩略图,与设置占位图有所不同,可以设置网络资源。使用如下:

Glide.with(activity)
      .load(url)
      .thumbnail(0.4f)
      .into(imageView);

意思很简单,就是展示原来0.4倍大小的一个缩略图。

3.动画开关

从Glide 3.7版本开始,默认开启了动画开关。如需关闭动画可调用dontAnimate。
但是在V4版本之后动画设置移入到TransitionOptions中,有如下三种:
GenericTransitionOptionsDrawableTransitionOptionsBitmapTransitionOptions

Glide.with(this)
    .load(url)
    .transition(DrawableTransitionOptions.withCrossFade())            //淡入淡出动画
    .apply(RequestOptions.noAnimation())        //关闭动画
    .into(imageView);

默认情况下动画时间是300ms。

4.图片缓存

内存缓存
为了实现图片快速加载,Glide帮我们实现了图片缓存功能,如果不需要使用则可调用skipMemoryCache(true)告诉Glide跳过内存缓存。
注意:该方法之对内存缓存有影响。

磁盘缓存
由于手机内存使用有限,内存资源比较珍贵,不可能将所有的图片资源缓存的内存中,因此为了提高加载效率,Glide还采用了磁盘缓存的方式。
磁盘缓存也是默认开启的,当然也可以关闭,方式如下:

Glide.with(activity)
    .load(url)
    .apply(RequestOptions.skipMemoryCacheOf(true)    //取消内存缓存
        .diskCacheStrategy(DiskCacheStrategy.NONE))    //取消图片磁盘缓存    
    .into(imageView);

缓存设置同样式通过RequestOptions进行设置的。

5.显示gif和video

Glide可以加载和显示一个gif,使用方式很简单,如下:

Glide.with(activity)
      .asGif()
      .load(url)
      .into(imageView);

注:这里如果加载的不是一个gif动画,将无法显示,所以asGif慎用。
Glide加载video只能针对本地的视频。

6.其他功能

Glide还有其他的功能,比如自已自定义缓存策略、设置优先级等。这里就不多说了。可以看看RequestOption类。

5、总结

1.针对两种方式的使用,可根据个人喜好自行选择;

2.Glide使用时,对url进行空检查并不是必须的,如果url为空,则会清空View的内容或者使用设置的默认图片资源;

3.使用在列表(ListView、RecyclerView等)中由于View的复用,因此针对在之前的位置上,用 Glide 进行过加载操作的情况,那么在新的位置上要重新into(view)操作,或调用clear()API 停止 Glide 的工作。否则可能会出现这样一个情况:你已经对一个view设置好了Drawable,但该 view 在之前的位置上使用 Glide 进行过加载图片的操作,在Glide 加载完毕后可能会将这个view改回成原来的内容,即没有设置成功问题。

至此,Glide开源框架的使用就是这么的简单,到这里就讲完了。
后面会从源码的角度对Glide进行分析。

本文参考文档:
Glide官方文档
Glide源码


Android图片加载框架Glide源码解析(一)
Android图片加载框架Glide源码解析(二)

你可能感兴趣的:(Android图片加载框架Glide源码解析(一))