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上获取: https://github.com/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;
@GlideModule
public 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 的复用和请求的取消:
@Override
public 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 的工作。
@Override
public 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篇相关推荐
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较
在android中的加载网络图片是一件十分令人头疼的事情,在网上有着许多关于加载网络图片的开源库,可以让我们十分方便的加载网络图片.在这里我主要介绍一下我自己在使用Volley, Picasso, U ...
- Android 6种加载网络图片的第三方详解
一. Glide加载 Glide.with(this).load("http://p0.qhimg.com/t015f3654b694ad2f8a.jpg").into(image ...
- Android网络图片加载缓存处理库的使用---第三方库学习笔记(五)
两款比较优秀的开源图片处理库框架:Universal-ImageLoader和Picasso. Universal-ImageLoader 简介: Universal-ImageLoader是目前An ...
- android异步加载图片并缓存到内存和sd卡上,Android批量图片加载经典系列——采用二级缓存、异步加载网络图片...
http://www.cnblogs.com/jerehedu/p/4560119.html 2015-06-08 09:20 by 杰瑞教育, 232 阅读, 1 评论, 收藏, 编辑一.问题描述 ...
- Android apk动态加载机制的研究(二):资源加载和activity生命周期管理
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了 ...
- Android 图片异步加载的体会,SoftReference已经不再适用
在网络上搜索Android图片异步加载的相关文章,目前大部分提到的解决方案,都是采用Map<String, SoftReference<Drawable>> 这样软引用的方式 ...
- 如何为Compose Image提供网络图片加载支持
本文是源码分析类文章 如何为Compose Image提供网络图片加载支持?目前(Compose 1.0.5)最好的选择是使用图片框架Coil,Coil对Jetpack Compose相关的支持文档在 ...
- Android 高清加载巨图方案 拒绝压缩图片
Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49300989: 本文出自: ...
- Android studio 使用心得(六)---android studio 如何加载.so文件
2019独角兽企业重金招聘Python工程师标准>>> 之前一直没怎么注意,以为.so文件android为像eclipse一样直接加载,但是直到昨天我在android studio上 ...
最新文章
- 体外反搏做_体外反搏治疗的原理
- php sku添加,php – 在单个产品页面中显示SKU下的自定义字段值
- 调用webapi 错误:使用 HTTP 谓词 POST 向虚拟目录发送了一个请求,而默认文档是不支持 GET 或 HEAD 以外的 HTTP 谓词的静态文件。的解决方案
- 路由器的×××流量过滤
- 变量命名 – 匈利亚命名法则 - C语言零基础入门教程
- 计算机网络利弊的作文英语作文,网络的弊端英语作文(精选6篇)
- endnote大客户版_Endnote软件的使用,有图有干货!
- 企业选型数据库系统的五点建议
- 宇宙那么大,跟着链游“上天”看看?
- 微信公众号模板消息管理
- 利用python下载钉钉群直播视频
- Office WORD如何为每一页设置不同的页眉页脚
- 增值电信业务经营许可证办理续期流程
- Spring Boot Redis 实现分布式锁,真香!!
- https SSL协议详解
- 二进制枚举+prim buy or build 问题
- 告研究生新生-研究生导师书
- J2EE学习从菜鸟变大鸟之四 JNDI(Java Naming and Directory Interface)
- 计算机开机引导过程的结果是,计算机开机的引导过程是怎么样的,学会了能解决大部分的开机问题...
- IPv6任播技术及其任播地址解析协议概述
热门文章
- 《当程序员的那些狗日日子》(四十四)是办公室还是牢房
- vue比较完整的方法介绍 和获取事件对象
- 深度活体模型带交互模型版
- 白月黑羽教python之selenium:课后练习
- 876. 快速幂求逆元
- appium命令版安装
- 很抱歉,OneDrive服务器出现问题,请稍后重试。(错误代码:0x8004def5)
- java基于springboot+Vue+nodejs的高校网上二手闲置跳蚤市场 element
- web前端大作业--黑色电影资讯博客网页设计(电影主题-HTML+CSS+JavaScript)
- 刘海洋 · LaTeX 不快速的入门 学习笔记