Glide开源库的使用

关于Glide

Glide是一款快速高效的Android图像加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。

Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。

Glide默认使用的是HttpUrlConnection类下载图片,但是也提供了与Google Volley和Square OkHttp快速集成的工具库。

虽然Glide 的主要目标是让任何形式的图片列表的滚动尽可能地变得更快、更平滑,但实际上,Glide几乎能满足你对远程图片的拉取/缩放/显示的一切需求。

Android SDK 要求

  • 使用 Glide 最小SDK版本(minSdkVersion)必须是API 14 (Ice Cream Sandwich) 或更高。
  • 使用Glide 编译SDK版本(compileSdkVersion)必须是 API 27 (Oreo MR1) 或更高版本

Android Studio在线依赖

Glide支持在线依赖,目前最新版本是4.8.0,在build.gradle文件中dependencies属性下增加两行代码。

dependencies {
    compile 'com.github.bumptech.glide:glide:4.8.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
}

权限

Glide一般情况下需要向AndroidManifest.xml文件中添加以下四个权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • INTERNET:访问网络权限,有了这个权限才能从网络上在线加载图片。
  • ACCESS_NETWORK_STATE:访问网络状态权限,不是必须的权限,但是加上可以处理片状网络(flaky network) 和飞行模式。
  • READ_EXTERNAL_STORAGE:阅读本地SD卡权限,从本地文件夹或 DCIM 或图库中加载图片。
  • WRITE_EXTERNAL_STORAGE:将Glide的缓存存储到SD卡上需要这个权限。

简单使用

Glide加载图片非常简单,只需要一行代码:

Glide.with(this)
    .load("https://github.com/ansen666/images/blob/master/" +
      "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true")
    .into(imageView);

上面这行代码先后调用了三个方法:

  • with 传入Activity或者Fragment实例,这里我们直接用this
  • load 图片url
  • into 图片加载完成之后显示在这个控件上

当然我们还可以取消加载,但是一般情况不需要使用,因为Glide.with()方法中传入的Activity或者Fragment实例销毁时,Glide 会自动取消加载并回收资源。

后台线程

其实Glide是可以通过后台线程获取Bitmap的,在后台线程中直接使用submit(int, int)方法。

new Thread(runnable).start();

//在后台线程中获取bitmap
Runnable runnable=new Runnable() {
    @Override
    public void run() {
        FutureTarget<Bitmap> futureTarget =
                Glide.with(MainActivity.this)
                        .asBitmap()
                        .load("https://github.com/ansen666/images/blob/master/" +
                                "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true")
                        .submit();
        try {
            Bitmap bitmap = futureTarget.get();
            Log.i("ansen","获取的bitmap:"+bitmap);

            //当上面获取的bitmap使用完毕时,调用clear方法释放资源
            Glide.with(MainActivity.this).clear(futureTarget);
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

首先新建一个线程,跟前面的加载图片不同的是我们调用了submit方法,这个方法可以传入一个宽高也可以不传,同时返回FutureTarget对象,在调用get方法获取我们需要的Bitmap,当我们获取的bitmap使用完毕时,记得调用clear方法释放资源。

futureTarget.get方法会抛出异常,需要用try catch捕捉。

当然,如果你不想开一个线程获取Bitmap也是可以的,可以通过主线程异步获取Bitmap方式。

Glide.with(this)
    .asBitmap()
    .load("https://github.com/ansen666/images/blob/master/" +
            "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true")
    .into(new SimpleTarget<Bitmap>() {
        @Override
        public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
            //这里我们拿到回掉回来的bitmap,可以加载到我们想使用到的地方
            imageView.setImageBitmap(resource);
        }
    
        @Override
        public void onLoadFailed(@Nullable Drawable errorDrawable) {
            super.onLoadFailed(errorDrawable);
            Log.i("ansen", "图片加载失败");
        }
    });

从上述代码中可以看到,into方法传入的是一个SimpleTarget对象,这个类是一个抽象类,这里我们使用内部类方式实现,重写这个类的两个方法(onResourceReady和onLoadFailed),onResourceReady加载图片成功会回调,同时把Bitmap当参数返回。onLoadFailed方法加载图片失败回调。

load方法传入其他参数

如果你以为Glide只能加载网络图片的话,那就不会有这么多人使用了,他还能支持Resources资源、File资源、Uri资源、字节数组等方式加载。

Glide.with(context).load(resourceId).into(imageView);
Glide.with(context).load(file).into(imageView);
Glide.with(context).load(uri).into(imageView);
Glide.with(context).load(byte[]).into(imageView);

加载gif图片

Glide支持直接加载Gif图片,使用也很简单,就多调用一个asGif方法而已

Glide.with(this).asGif().load(R.mipmap.result).into(ivGif);

Generated API

Glide v4 使用 注解处理器 (Annotation Processor) 来生成出一个 API,在 Application 模块中可使用该流式 API 一次性调用到 RequestBuilder, RequestOptions 和集成库中所有的选项。

Generated API 模式的设计出于以下两个目的:

  • 集成库可以为 Generated API 扩展自定义选项。
  • 在 Application 模块中可将常用的选项组打包成一个选项在 Generated API 中使用
开始使用

Generated API 目前仅可以在 Application 模块内使用。这一限制可以让我们仅持有一份 Generated API,而不是各个 Library 和 Application 中均有自己定义出来的 Generated API。

这一做法会让 Generated API 的调用更简单,并确保 Application 模块中 Generated API 调用的选项在各处行为一致。这一限制在接下来的版本中也许会被取消(以实验性或其他的方式给出)。

在app模块中使用Generated API,需要两个步骤:

1.添加 Glide 注解处理器的依赖

dependencies {
  annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
}

我们文章开头讲解Android Studio在线依赖的时候就有包含这个,所以这个步骤可以忽略。

在 Application 模块中包含一个 AppGlideModule 的实现
我们新建一个类,类名叫MyAppGlideModule,名字可以随便起,但是必须要继承自AppGlideModule,以及给类加上@GlideModule注解标记。

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

/**
 * @author ansen
 * @create time 2018/10/28
 */
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {
}

Android Studio 在大多数时候都可以正确地处理注解处理器 (annotation processor) 和 generated API。然而,当你第一次添加 AppGlideModule 时,需要重新 (rebuild) 一下项目。不然使用GlideApp类时会提示找不到这个类。

使用Generated API

Generated API 默认名为 GlideApp ,使用起来跟之前Glide方式一样,只需要把Glide替换成GlideApp,例如加载在线图片显示,代码如下:

//Generated API 使用方式
GlideApp.with(this)
    .load("https://github.com/ansen666/images/blob/master/" +
            "public/qrcode_for_gh_14a89f21bd5e_258.jpg?raw=true")
    .into(imageView);

与 Glide.with() 不同,诸如 fitCenter() 和 placeholder() 等选项在 Builder 中直接可用,并不需要再传入单独的 RequestOptions 对象。

说点废话

今天Glide就给大家介绍到这里了,接下来我还会讲解Glide占位符、动画、Target、配置、缓存、集成Okhttp等一系列文章,希望大家持续关注,新的一个礼拜又开始了,祝大家工作愉快。

源码下载:

https://github.com/ansen666/GlideTest

如果你想第一时间看我的后期文章,扫码关注公众号,长期推送Android开发文章、最新动态、开源项目,让你各种涨姿势。

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

推荐阅读更多精彩内容