Glide进阶详解(九)
2017-01-22 22:09
405 查看
集成网络栈
通过 HTTP/HTTPS 从网络上下载图像并显示是非常重要的一块。虽然标准的 Android 网络包也能做这些工作,但在 Android 中开发了很多提升网络的模块。每个库有它自己的优势和劣势。最后,这其实需要项目的配合和开发人员自己的品位来决定的。Glide 的开发者不强制设置网络库给你,所以 Glide 可以说和 HTTP/S 无关。理论上,它可以与任何的网络库实现,只要覆盖了基本的网络能力就行。用 Glide 集成一个网络不是完全无缝的。它需要一个 Glide 的 ModeLoader 的接口。为了让你更加易用,Glide
为2个网络库提供了实现:OkHttp 和 Volley。
OkHttp
假定你要集成 OkHttp 作为你给 Glide 的网络库。集成可以通过声明一个 GlideModule手动实现。如果你想要避免手动实现,只需要打开你的
build.gradle然后在你的依赖中添加下面这两行代码:
dependencies { // your other dependencies // ... // Glide compile 'com.github.bumptech.glide:glide:3.6.1' // Glide's OkHttp Integration compile 'com.github.bumptech.glide:okhttp-integration:1.3.1@aar' compile 'com.squareup.okhttp:okhttp:2.5.0' }
Gradle 会自动合并必要的
GlideModule到你的
Android.Manifest。Glide
会认可在 manifest 中的存在,然后使用 OkHttp 做到所有的网络连接。
Volley
另一方面,如果你偏爱使用 Volley,你必须改变你的 build.gradle依赖:
dependencies { // your other dependencies // ... // Glide compile 'com.github.bumptech.glide:glide:3.6.1' // Glide's Volley Integration compile 'com.github.bumptech.glide:volley-integration:1.3.1@aar' compile 'com.mcxiaoke.volley:library:1.0.8' }
这将添加 Volley 并集成该库到你的项目中。集成库添加到
GlideModule到你的
Android.Manifest。Glide
会自动认出它,然后使用 Volley 作为网络库。并不要求做其他的配置!
警告::如果你把这两个库都在你的
build.gradle中声明了,那这两个库都会被添加。因为
Glide 没有任何特殊的加载顺序,你将会有一个不稳定的状态,它并不明确使用哪个网络库,所以确保你只添加了一个集成库。
其他网络库
如果你是别的网络库的粉丝,你是不幸的。Glide 除了 Volley 和 OkHttp 外不会自动配置其他的库。然而你随时可以整合你喜欢的网络库,在 GitHub 上去开一个 pull request。为Volley和 OkHttp 可能给你一个方向。
Glide Modules
Glide module 是一个抽象方法,全局改变 Glide 行为的一个方式。如果你需要访问 GlideBuilder,它要在你要做的地方创建
Glide 实例,这是要做的一种方法。为了定制 Glide,你需要去实现一个 GlideModule 接口的公共类。
public class SimpleGlideModule implements GlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { // todo } @Override public void registerComponents(Context context, Glide glide) { // todo } }
该接口提供了两种发发来调整 Glide 不同的组件。在这篇博客中,我们主要看第一个方法
applyOptions(Context context, GlideBuilder builder)。
所以你知道要创建一个额外的类去定制 Glide。下一步是要全局的去声明这个类,让 Glide 知道它应该在哪里被加载和使用。Glide 会扫描
AndroidManifest.xml为
Glide module 的 meta 声明。因此,你必须在
AndroidManifest.xml的
<application>标签内去声明这个刚刚创建的
Glide module。
<manifest ... <application> <meta-data android:name="io.futurestud.tutorials.glide.glidemodule.SimpleGlideModule" android:value="GlideModule" /> ... </application> </manifest>
请确保你将
android:name属性改成你的包名+类名的形式,这样的引用才是正确的。就这样,你不需要去添加其他任何代码。如果你想删掉
Glide Module,只需要把它从
AndroidManifest.xml中移除就可以了。Java 类可以保存,说不定以后会用呢。如果它没有在
AndroidManifest.xml中被引用,那它不会被加载或被使用。
你去定制 module 的话 Glide 会有这样一个优点:你可以同时声明多个 Glide module。Glide 将会(没有特定顺序)得到所有的声明 module。因为你当前不能定义顺序,请确保定制不会引起冲突!
GlideBuilder
好了,你知道如何用 Glide module 定制 Glide 了。现在来看看接口的第一个方法:applyOptions(Context context, GlideBuilder builder)。该方法给你了一个
GlideBuilder对象作为变量。这个方法是一个
void的返回类型,所以你可以在这个方法里去调
GlideBuilder中可用的方法。
.setMemoryCache(MemoryCache memoryCache)
.setBitmapPool(BitmapPool bitmapPool)
.setDiskCache(DiskCache.Factory diskCacheFactory)
.setDiskCacheService(ExecutorService service)
.setResizeService(ExecutorService service)
.setDecodeFormat(DecodeFormat decodeFormat)
你可以看到,这个
GlideBuilder对象给你访问了 Glide 重要的核心组件。在这个博客中使用的方法,你可以改变磁盘缓存,内存缓存等等!
我们稍后会看到更多进阶的组件,但是现在我们先挑一个相对加单的改变:
.setDecodeFormat(DecodeFormat decodeFormat)。
使用实例:增加 Glide 的图片质量
在 Android 中有两个主要的方法对图片进行解码:ARGB8888 和 RGB565。前者为每个像素使用了 4 个字节,后者仅为每个像素使用了 2 个字节。ARGB8888 的优势是图像质量更高以及能存储一个 alpha 通道。Picasso 使用ARGB8888,Glide 默认使用低质量的 RGB565。对于 Glide 使用者来说:你使用 Glide module 方法去改变解码规则。
你只需要实现一个
GlideModule,像我们上面给你显示的那样,然后使用正确的枚举值调用
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888)。
public class SimpleGlideModule implements GlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); } @Override public void registerComponents(Context context, Glide glide) { // nothing to do here } }
如果你是正确的按照我们的步骤来的话,Glide 现在回用更高质量的图片解码。这种改变方式也遵循 Glide 的行为,适用于其他的模式。代码在
registerComponents()会看起来有一点不同,我们很快会看到的。
因为这是一个相当复杂的话题,我们将在下周通过一个实际的例子去实践:如何用一个
GlideModule的
registerComponents()方法去从服务端使用
self-signed HTTPS 认证(这不是默认实现的)的方式去接收图片。
资源
GlideModules on Glide’s Github
相关文章推荐
- 菜鸟学Linux 第088篇笔记 配置heartbeat基于crm管理
- Android中自动接听电话的功能
- iframe
- MyBatis Generator无法生成selectByPrimaryKey(),updateByPrimaryKey()的解决方法
- linux文件授权
- AVX2整数向量运算
- 三层学习
- 三层学习
- POJ3469 Dual Core CPU
- Java获取集合泛型的类型上的注解
- Redis-类型检查与命令多态
- Qt 之 截图功能进阶(四)截图时显示当前截图信息
- 花信年华--You're gonna love who you turn out to be
- 关于我的PP0.1聊天软件(客户端)
- 网络编程中的CAP & 有趣的存储框架(关系型、NoSQL)全图
- MySQL Group Replication的RECOVERING状态深度理解
- 博为峰JavaEE技术文章 ——MyBatis Mapper TypeHandler
- GCD The Largest
- 数值分析与算法——读书笔记(一)
- linux系统监控命令