关于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 - 安卓开发技术分享
扫描二维码加关注

Glide开源库的使用的更多相关文章

  1. 100个Github上Android开源库

    项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native, ...

  2. GitHub上排名前100的Android开源库介绍(来自github)

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然后过滤了 ...

  3. GitHub Top 100的Android开源库

    摘要: 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择「Best M... 本项目主要对目前 GitH ...

  4. GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    若有任何疑问可通过邮件或微博联系我 项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开 ...

  5. GitHub开源库排名一百的简单介绍,值得收藏!

    GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub ...

  6. 开源库BaseRecyclerViewAdapterHelper

    相信大家RecyclerView应该不会陌生,大多数开发者应该都使用上它了,它也是google推荐替换ListView的控件,但是用过它的同学应该都知道它在某些方面并没有ListView使用起来方便, ...

  7. 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...

  8. <Android开源库 ~ 1> GitHub Android Libraries Top 100 简介

    转载自GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitH ...

  9. GitHub上排名前100的Android开源库介绍

    GitHub上排名前100的Android开源库介绍 文章来源: http://www.open-open.com/news/view/1587067#6734290-qzone-1-31660-bf ...

随机推荐

  1. 一文让你彻底理解 Java NIO 核心组件

    背景知识 同步.异步.阻塞.非阻塞 首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下. 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节). 异步:相对于同 ...

  2. [译]ASP.NET Core中使用MediatR实现命令和中介者模式

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9866068.html 在本文中,我将解释命令模式,以及如何利用基于命令模式的第三方库来实现它们,以及如何 ...

  3. Java 容器源码分析之 ArrayList

    概览 ArrayList是最常使用的集合类之一了.在JDK文档中对ArrayList的描述是:ArrayList是对list接口的一种基于可变数组的实现.ArrayList类的声明如下: 12 pub ...

  4. 翻译:SELECT INTO语句(已提交到MariaDB官方手册)

    本文为mariadb官方手册:SELECT INTO的译文. 原文:https://mariadb.com/kb/en/selectinto/我提交到MariaDB官方手册的译文:https://ma ...

  5. RNN入门(三)利用LSTM生成旅游点评

    介绍   前几天,某个公众号发文质疑马蜂窝网站,认为它搬运其它网站的旅游点评,对此,马蜂窝网站迅速地做出了回应.相信大多数关注时事的群众已经了解了整个事情的经过,在这里,我们且不论这件事的是是非非,也 ...

  6. [转]How to display the data read in DataReceived event handler of serialport

    本文转自:https://stackoverflow.com/questions/11590945/how-to-display-the-data-read-in-datareceived-event ...

  7. ResourceOwnerPassword模式使用数据库.

    有时候, ResourceOwnerPassword模式有用的, 可以用来代替我们原来管理程序的开发方式. 因为管理程序本身拥有用户数据的权限嘛, 并不是第三方应用, 无需要授权 集成很简单. 1. ...

  8. .net core Identity集成IdentityServer(3) 一键登出

    在客户端程序, 我们补充一键登出操作. 使用了idsv之后, 退出的操作需要删除本地cookie, 然后去请求认证服务器, 也删除认证服务器的cookie. 官网给的退出的代码 public asyn ...

  9. 编译部署mysql5.7.13

    署环境centos7.2+mysql5.7.131.依赖包注: 相关依赖包的作用cmake:由于从 MySQL5.5 版本开始弃用了常规的 configure 编译方法,所以需要 CMake 编译器, ...

  10. 使用wubi安装ubuntu14.04出现的常见错误的解决办法

    花了一天的时间终于安装上了Ubuntu14.04,过程坎坷,是血泪史,开始报“cannot download the metalink and therefore the ISO”错误,解决后,又报“ ...