Android glide框架及框架涉及到的设计模式

目录

      • 原文链接
      • Android glide框架 简单使用介绍
        • Glide 框架整体结构设计
        • Glide 框架的优点
        • 基本使用:
        • Glide占位符
      • Android glide框架涉及到的设计模式

原文链接

Android glide框架 简单使用介绍

Glide:快速高效的Android图片加载库,可以自动加载网络、本地文件、app资源中的图片,注重于平滑的滚动

Glide基本使用
开源地址:https://github.com/bumptech/glide
中文文档:https://muyangmin.github.io/glide-docs-cn/

模块的build.gradle中引入Glide:

implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'

Glide 框架整体结构设计

原文链接
在这里插入图片描述

  1. Glide 框架主要分为两大流程:
    1.1 图片请求的构建流程。
    1.2 图片缓存的获取流程。

  2. 图片请求构建流程内又分为四个模块:
    2.1 用户态的请求模块: 用户使用 Glide 进行链式调用的时候会生成一个用户态的 Request。
    2.2 真实的请求模块: 由于步骤2.1中会根据场景构建多种Request,因此在发起图片请求时需要进行收口,因此会使用用户态的 Request 构建一个真正的 GenericRequest 请求。
    2.3 Request 生命周期管理模块: Glide 的一大特点是会将图片的请求和页面生命周期进行绑定,避免出现内存泄漏的风险,因此会有一个 Request 生命周期管理模块。
    2.4 Registry中心模块: 由于 Glide 支持加载多种类型的数据,因此在注册中心会预先注册所支持类型处理类的信息。

  3. 图片缓存一共分为3大层,5小层:
    3.1 内存缓存(2小层): 弱引用缓存、LruCache。
    3.2 本地缓存(2小层): 本地 ResultCache 缓存、本地 SourceCache 缓存。
    3.3 Source 数据源(1小层): 网络获取、本地 AssetPath 获取、其它本地图片。

五层缓存进行定义
第一层:内存缓存 -> 弱应用缓存(ActiveResource)。
第二层:内存缓存 -> LruCache
第三层:磁盘缓存 -> ResultCache (经过transform的图)
第四层:磁盘缓存 -> SourceCache (从DataFetcher 直接拉取到的数据)
第五层:数据源 -> Source
Glide 框架的优点
加载类型多样化:Glide 支持 Gif、WebP、Jpeg、Png 等格式的图片。
生命周期的绑定:图片请求与页面生命周期绑定,避免内存泄漏。
使用简单(链式调用),且提供丰富的 Api 功能 (如: 图片裁剪等功能)。
高效的缓存策略:

Glide 框架的优点

  1. 支持多种缓存策略 (Memory 和 Disk 图片缓存)。
  2. 根据 ImageView 的大小来加载相应大小的图片尺寸。
  3. 内存开销小,默认使用 RGB_565 格式 (3.x 版本)。
  4. 复用对象 (享元模式),降低内存的抖动。
  5. 通过 Lru 算法来管理内存缓存和磁盘缓存,保证资源使用的可控性。

基本使用:

Glide.with(this)
.load(strUrl)
.into(mShow_img);
  1. Glide.with中参数是哪个环境变量对象,说明它会和哪个环境变量的生命周期绑定到一起。
    Glide的使用大量减少了因为图片导致的OOM的可能。
  2. url 可以是一个R.** 的图片资源id,也可以是https.*, 也可以是文件对象
    如果是https,则需在AndroidManifest.xml中申请网络权限;如果是文件对象,则需在AndroidManifest.xml中申请存储卡读写权限。
  3. into方法将图片传递给指定的ImageView

Glide占位符

Glide4中占位图的使用方法,包括(placeholder、error、fallback)三种占位图:

  • placeholder:正在请求图片的时候展示的图片
  • error:如果请求失败的时候展示的图片(如果没有设置,还是展示placeholder的占位符)
  • fallback:如果请求的url/model为 null 的时候展示的图片(如果没有设置,还是展示placeholder的占位符)
RequestOptions requestOptions = new RequestOptions().placeholder(R.drawable.hold).error(R.drawable.error).fallback(R.drawable.fallback).override(100, 100);  //override指定加载图片大小,可不设置Glide.with([fragment/Context/View]).load(url).apply(requestOptions).into(imageView);

Android glide框架涉及到的设计模式

  1. Builder 模式:Glide 使用 Builder 模式来构建图片加载请求。通过链式调用一系列方法设置加载参数和配置,最后调用 into() 方法执行加载操作。
Glide.with(context).load(imageUrl).placeholder(R.drawable.placeholder).centerCrop().into(imageView);
  1. Singleton(单例)模式:Glide 的核心组件 Glide、RequestManager 和 RequestBuilder 都采用了单例模式,确保在整个应用程序中只有一个实例。
Glide glide = Glide.get(context);
RequestManager requestManager = Glide.with(fragment);
  1. Proxy(代理)模式:Glide 使用了代理模式来实现图片加载的过程。通过使用 RequestManager 作为中介,封装了 Glide 的加载逻辑,并提供了一系列的方法来管理加载请求。
RequestManager requestManager = Glide.with(context);
requestManager.load(imageUrl).placeholder(R.drawable.placeholder).into(imageView);
  1. Strategy(策略)模式:Glide 中的 Transformation 和 Decoder 使用了策略模式。Transformation 定义了一系列的图片转换策略,如圆角、缩放等;Decoder 定义了一系列的图片解码策略,如 Bitmap、Gif 等。
RequestOptions requestOptions = new RequestOptions().transform(new RoundedCorners(16)).override(300, 300);Glide.with(context).load(imageUrl).apply(requestOptions).into(imageView);
  1. Observer(观察者)模式:Glide 中的生命周期管理使用了观察者模式。通过监听 Fragment 或 Activity 的生命周期回调,及时清理和取消图片加载请求,避免内存泄漏和无效的请求。
@Override
public void onStart() {super.onStart();Glide.with(this).onStart();
}@Override
public void onStop() {super.onStop();Glide.with(this).onStop();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/98256.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【100天精通python】Day38:GUI界面编程_PyQt 从入门到实战(中)_数据库操作与多线程编程

目录 专栏导读 4 数据库操作 4.1 连接数据库 4.2 执行 SQL 查询和更新: 4.3 使用模型和视图显示数据 5 多线程编程 5.1 多线程编程的概念和优势 5.2 在 PyQt 中使用多线程 5.3 处理多线程间的同步和通信问题 5.3.1 信号槽机制 5.3.2 线程安全的数据访问 Q…

更新arm的linux编译工具链

虑到目前arm的gcc 5.5的工具链对C17语法支持不足,需要升级下工具链。 以下是详细步骤。使用官方提供的工具链 ARM官方的工具链网站: https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads bare-metal这个版本就是没有操作系统(裸机环…

QChart类用来 管理 图表的:数据序列(series)、图例(legend)和坐标轴(axis)

QChart类用来 管理 图表的:数据序列(series)、图例(legend)和坐标轴(axis) 1、数据序列类 继承关系 2、坐标轴类 的继承关系 3、图例类 什么是图例? 图例:是集中于地图…

06_布隆过滤器BloomFilter_副本

06——布隆过滤器BloomFilter 一、是什么 由一个初始值都为零的bit数组和多个哈希函数构成,用来快速判断集合中是否存在某个元素 设计思想: 1. 目的:减少内存占用 1. 方式:不保存数据信息,只是在内存中做一个是否存…

Labview选项卡之实现被选择选项卡工作

文章目录 前言一、使用选项卡二、实现被选择选项卡工作1、需求2、分析3、实现①、前面板②、程序框图 三、效果展示四、源码自取 前言 有些时候,我们做界面,需要好多个界面切换。如果是同一个 VI 里界面切换,一般都是选项卡了。切换不同选项…

linkis 1.1.1 报错 No plugin found spark-2.4.8, please check your configuration

按照官方教程设置,但是仍然报错 Caused by: java.util.concurrent.ExecutionException: LinkisException{errCode70063, descNo plugin found spark-2.4.8, please check your configuration, iphadoop0004, port9103, serviceKindlinkis-cg-engineplugin} 这个时候,我们首先检…

探索高级UI、源码解析与性能优化,了解开源框架及Flutter,助力Java和Kotlin筑基,揭秘NDK的魅力!

课程链接: 链接: https://pan.baidu.com/s/13cR0Ip6lzgFoz0rcmgYGZA?pwdy7hp 提取码: y7hp 复制这段内容后打开百度网盘手机App,操作更方便哦 --来自百度网盘超级会员v4的分享 课程介绍: 📚【01】Java筑基:全方位指…

Maven之tomcat7-maven-plugin 版本低的问题

tomcat7-maven-plugin 版本『低』的问题 相较于当前最新版的 tomcat 10 而言,tomcat7-maven-plugin 确实看起来很显老旧。但是,这个问题并不是问题,至少不是大问题。 原因 1:tomcat7-maven-plugin 仅用于我们(程序员&…

关于docker-compose up -d在文件下无法运行的原因以及解决方法

一、确认文件下有docker-compose.yml文件 二、解决方法 检查 Docker 服务是否运行: 使用以下命令检查 Docker 服务是否正在运行: systemctl status docker 如果 Docker 未运行,可以使用以下命令启动它: systemctl start docker …

Debian查询硬件状态

很早以前写过一个查询树霉派硬件状态的文章,用是Python写的一个小程序。里面用到了vcgencmd这个测温度的内部命令,但这个命令在debian里面没有,debian里只有lm_sensors的外部命令,需要安装:apt-get install lm_sensors…

LeetCode_动态规划_困难_1388.3n 块披萨

目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一个披萨,它由 3n 块不同大小的部分组成,现在你和你的朋友们需要按照如下规则来分披萨: 你挑选任意一块披萨。Alice 将会挑选你所选择的披萨逆时针方向的下一块披萨。…

JVM面试题-2

1、有哪几种垃圾回收器,各自的优缺点是什么? 垃圾回收器主要分为以下几种:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1; Serial:单线程的收集器,收集垃圾时,必须stop the worl…

STM32——RTC实时时钟

文章目录 Unix时间戳UTC/GMT 时间戳转换BKP简介BKP基本结构读写BKP备份寄存器电路设计关键代码 RTC简介RTC框图RTC基本结构硬件电路RTC操作注意事项读写实时时钟电路设计关键代码 Unix时间戳 Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日…

git 回滚相关问题

原本用as自带的git执行回滚任务, 但是提交之后发现并没有成功, 后面通过命令行的方式重新回滚并且提交上去,就可以了 说明as的git还是有点小瑕疵,还是命令行最稳妥 相关博文: git代码回滚操作_imkaifan的博客-CSDN博…

05_bitmaphyperloglogGEO

Bitmap&hyperloglog&GEO 面试问 记录对集合中的数据进行统计在移动应用中,需要统计每天的新增用户数和第2天的留存用户数;在电商网站的商品评论中,需要统计评论列表中的最新评论:在签到打卡中,需要统计一个月内…

SpringBoot、Java 使用 Jsoup 解析 HTML 页面

使用 Jsoup 解析 HTML 页面 什么是 Jsoup? Jsoup 是一个用于处理 HTML 页面的 Java 库,它提供了简单的 API,使得从 HTML 中提取数据变得非常容易。无论是获取特定标签的内容还是遍历整个页面的元素,Jsoup 都能轻松胜任。 如何使…

思维进化算法(MEA)优化BP神经网络

随着计算机科学的发展,人们借助适者生存这一进化规则,将计算机科学和生物进化结合起来,逐渐发展形成一类启发式随机搜索算法,这类算法被称为进化算法(Evolutionary Com-putation, EC)。最著名的进化算法有:遗传算法、进化策略、进化规划。与传统算法相比,进化算法的特点是群体搜…

react之路由的安装与使用

一、路由安装 路由官网2021.11月初,react-router 更新到 v6 版本。使用最广泛的 v5 版本的使用 npm i react-router-dom5.3.0二、路由使用 2.1 路由的简单使用 第一步 在根目录下 创建 views 文件夹 ,用于放置路由页面 films.js示例代码 export default functio…

基于深度学习的指针式仪表倾斜校正方法——论文解读

中文论文题目:基于深度学习的指针式仪表倾斜校正方法 英文论文题目:Tilt Correction Method of Pointer Meter Based on Deep Learning 周登科、杨颖、朱杰、王库.基于深度学习的指针式仪表倾斜校正方法[J].计算机辅助设计与图形学学报, 2020, 32(12):9.DOI:10.3724…

使用zoom预览出图和系统相机预览出图,画质不一样的问题分析

1、问题背景 最近在基于 Android 的平台调试一款摄像头,客户有反馈一个问题,系统自带的 Camera2 app 预览出图是正常的,但用 Zoom app 打开摄像头,出图画面存在畸变、锯齿、过曝的问题,现象如下图所示。 2、问题分析 …