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

目录

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

原文链接

Android glide框架 简单使用介绍

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

Glide基本使用

开源地址:https://github.com/bumptech/glide

中文文档:https://muyangmin.github.io/glide-docs-cn/

模块的build.gradle中引入Glide:

java 复制代码
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 算法来管理内存缓存和磁盘缓存,保证资源使用的可控性。

基本使用:

java 复制代码
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的占位符)
java 复制代码
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() 方法执行加载操作。
java 复制代码
Glide.with(context)
     .load(imageUrl)
     .placeholder(R.drawable.placeholder)
     .centerCrop()
     .into(imageView);
  1. Singleton(单例)模式:Glide 的核心组件 Glide、RequestManager 和 RequestBuilder 都采用了单例模式,确保在整个应用程序中只有一个实例。
java 复制代码
Glide glide = Glide.get(context);
RequestManager requestManager = Glide.with(fragment);
  1. Proxy(代理)模式:Glide 使用了代理模式来实现图片加载的过程。通过使用 RequestManager 作为中介,封装了 Glide 的加载逻辑,并提供了一系列的方法来管理加载请求。
java 复制代码
RequestManager requestManager = Glide.with(context);
requestManager.load(imageUrl)
             .placeholder(R.drawable.placeholder)
             .into(imageView);
  1. Strategy(策略)模式:Glide 中的 Transformation 和 Decoder 使用了策略模式。Transformation 定义了一系列的图片转换策略,如圆角、缩放等;Decoder 定义了一系列的图片解码策略,如 Bitmap、Gif 等。
java 复制代码
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 的生命周期回调,及时清理和取消图片加载请求,避免内存泄漏和无效的请求。
java 复制代码
@Override
public void onStart() {
    super.onStart();
    Glide.with(this).onStart();
}

@Override
public void onStop() {
    super.onStop();
    Glide.with(this).onStop();
}
相关推荐
此去正年少12 分钟前
编写adb脚本工具对Android设备上的闪退问题进行监控分析
android·adb·logcat·ndk·日志监控
落羽凉笙33 分钟前
Python基础(4)| 玩转循环结构:for、while与嵌套循环全解析(附源码)
android·开发语言·python
十幺卜入1 小时前
Unity3d C# 基于安卓真机调试日志抓取拓展包(Android Logcat)
android·c#·unity 安卓调试·unity 安卓模拟·unity排查问题
frontend_frank1 小时前
脱离 Electron autoUpdater:uni-app跨端更新:Windows+Android统一实现方案
android·前端·javascript·electron·uni-app
薛晓刚2 小时前
MySQL的replace使用分析
android·adb
DengDongQi2 小时前
Jetpack Compose 滚轮选择器
android
stevenzqzq2 小时前
Android Studio Logcat 基础认知
android·ide·android studio·日志
代码不停2 小时前
MySQL事务
android·数据库·mysql
朝花不迟暮2 小时前
使用Android Studio生成apk,卡在Running Gradle task ‘assembleDebug...解决方法
android·ide·android studio
yngsqq2 小时前
使用VS(.NET MAUI)开发第一个安卓APP
android·.net