失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Android 进阶:网络图片加载 - Glide篇

Android 进阶:网络图片加载 - Glide篇

时间:2019-01-01 14:49:12

相关推荐

Android 进阶:网络图片加载 - Glide篇

概述:

Glide官网

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

Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。Glide的Api是如此的灵活,开发者甚至可以插入和替换成自己喜爱的任何网络栈。默认情况下,Glide使用的是一个定制化的基于HttpUrlConnection的栈,但同时也提供了与Google Volley和Square OkHttp快速集成的工具库。

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

性能

Glide 充分考虑了Android图片加载性能的两个关键方面:

图片解码速度解码图片带来的资源压力

为了让用户拥有良好的App使用体验,图片不仅要快速加载,而且还不能因为过多的主线程I/O或频繁的垃圾回收导致页面的闪烁和抖动现象。

Glide使用了多个步骤来确保在Android上加载图片尽可能的快速和平滑:

自动、智能地下采样(downsampling)和缓存(caching),以最小化存储开销和解码次数;积极的资源重用,例如字节数组和Bitmap,以最小化昂贵的垃圾回收和堆碎片影响;深度的生命周期集成,以确保仅优先处理活跃的Fragment和Activity的请求,并有利于应用在必要时释放资源以避免在后台时被杀掉。

要求:

Glide v4最低支持Android Ice Cream Sandwich (API level 14).

二、 使用:

1 . 前期准备:
在build.gradle 中添加:

implementation ‘com.github.bumptech.glide:glide:4.8.0’

最新版本可到github上获取: /bumptech/glide

2. 示例:
2.1 基本用法

Glide 使用简明的流式语法API,这是一个非常棒的设计,因为它允许你在大部分情况下一行代码搞定需求:

Glide.with(fragment).load(myUrl).into(imageView);

取消加载同样很简单:

Glide.with(fragment).clear(imageView);

尽管及时取消不必要的加载是很好的实践,但这并不是必须的操作。实际上,当 Glide.with() 中传入的 Activity 或 Fragment 实例销毁时,Glide 会自动取消加载并回收资源。

2.2在 Application 模块中的使用

在 Application 模块中,可创建一个添加有 @GlideModule 注解,继承自 AppGlideModule 的类。此类可生成出一个流式 API,内联了多种选项,和集成库中自定义的选项:

package com.example.myapp;import com.bumptech.glide.annotation.GlideModule;import com.bumptech.glide.module.AppGlideModule;@GlideModulepublic final class MyAppGlideModule extends AppGlideModule {}

生成的 API 默认名为 GlideApp ,与 AppGlideModule 的子类包名相同。在 Application 模块中将 Glide.with() 替换为 GlideApp.with(),即可使用该 API 去完成加载工作。

GlideApp.with(fragment).load(myUrl).placeholder(placeholder).fitCenter().into(imageView);

2.3 在 ListView 和 RecyclerView 中的使用

在 ListView 或 RecyclerView 中加载图片的代码和在单独的 View 中加载完全一样。Glide 已经自动处理了 View 的复用和请求的取消:

@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {String url = urls.get(position);Glide.with(fragment).load(url).into(holder.imageView);}

对 url 进行 null 检验并不是必须的,如果 url 为 null,Glide 会清空 View 的内容,或者显示 placeholder Drawable 或 fallback Drawable 的内容。

Glide 唯一的要求是,对于任何可复用的 View 或 Target ,如果它们在之前的位置上,用 Glide 进行过加载操作,那么在新的位置上要去执行一个新的加载操作,或调用 clear() API 停止 Glide 的工作。

@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {if (isImagePosition(position)) {String url = urls.get(position);Glide.with(fragment).load(url).into(holder.imageView);} else {Glide.with(fragment).clear(holder.imageView);holder.imageView.setImageDrawable(specialDrawable);}}

对 View 调用 clear() 或 into(View),表明在此之前的加载操作会被取消,并且在方法调用完成后,Glide 不会改变 view 的内容。如果你忘记调用 clear(),而又没有开启新的加载操作,那么就会出现这种情况,你已经为一个 view 设置好了一个 Drawable,但该 view 在之前的位置上使用 Glide 进行过加载图片的操作,Glide 加载完毕后可能会将这个 view 改回成原来的内容。

这里的代码以 RecyclerView 的使用为例,但规则同样适用于 ListView。

2.4 非 View 目标

除了将 Bitmap 和 Drawable 加载到 View 之外,你也可以开始异步加载到你的自定义 Target 中:

Glide.with(context.load(url).into(new SimpleTarget<Drawable>() {@Overridepublic void onResourceReady(Drawable resource, Transition<Drawable> transition) {// Do something with the Drawable here.}});

如果加载不出来网络图片,请看Android Studio 处理网络图片加载不出来问题。

如果觉得《Android 进阶:网络图片加载 - Glide篇》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。