Glide系列-自定义ModuleLoader
在当今快速发展的移动应用领域,图片的高效加载和显示对于提供流畅用户体验至关重要。Glide作为一款强大的图片加载库,已经成为Android开发者的首选工具之一。但是,你有没有遇到过Glide默认不支持的模型类型,或者需要对图片加载过程进行特殊定制的情况呢?
本文将带你深入了解Glide的自定义ModelLoader,这是一个能够让你将任何类型的模型转换为Glide可以处理的数据的神奇工具。无论你是需要从Base64编码的字符串加载图片,还是想要集成一个新的网络库,自定义ModelLoader都能帮你轻松实现。
我们将从零开始,一步步指导你如何创建一个自定义的ModelLoader,包括如何实现关键的handles和buildLoadData方法,以及如何编写一个高效的DataFetcher。此外,我们还会展示如何在Glide中注册你的新ModelLoader,以便它能够被应用到实际的图片加载中。
通过本教程,你将掌握Glide的高级定制技巧,提升你的应用性能,并为用户提供更加丰富的视觉体验。让我们一起探索Glide的强大功能,释放你的创造潜能!
接入依赖
在你的Android项目的build.gradle文件中,你需要添加Glide的依赖以及它的注解处理器,以便编译器能够理解Glide的注解。以下是Glide的相关Gradle依赖:
dependencies {// 添加Glide的依赖implementation 'com.github.bumptech.glide:glide:4.11.0'// 添加Glide的注解处理器依赖annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
}
以下是一个创建和使用自定义ModelLoader的步骤指南:
编写一个ModelLoader
创建一个新的类,实现ModelLoader接口,并指定你的模型类型(Model)和数据类型(Data)。
public class CustomModelLoader implements ModelLoader<String, ByteBuffer> {
}
实现handles方法:
handles方法用于判断传入的模型是否可以被当前的ModelLoader处理。例如,如果你的模型是一个Base64编码的字符串,handles方法应该检查字符串是否符合Base64数据URI的格式。
@Override
public boolean handles(String model) {return model.startsWith("data:image/;base64,");
}
实现buildLoadData方法:
buildLoadData方法负责创建LoadData对象,其中包含用于缓存的键(Key)和用于获取数据的DataFetcher。
@Override
public LoadData<ByteBuffer> buildLoadData(String model, int width, int height, Options options) {return new LoadData<>(new ObjectKey(model), new CustomDataFetcher(model));
}
编写DataFetcher
DataFetcher是实际获取数据的组件。你需要实现DataFetcher接口,并定义如何从模型中获取数据。
public class CustomDataFetcher implements DataFetcher<ByteBuffer> {private final String model;public CustomDataFetcher(String model) {this.model = model;}@Overridepublic void loadData(Priority priority, DataCallback<? super ByteBuffer> callback) {// 解码Base64字符串为ByteBufferbyte[] bytes = Base64.decode(model.split(",")[1], Base64.DEFAULT);ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);callback.onDataReady(byteBuffer);}// 其他DataFetcher方法的实现...
}
使用Glide注册ModelLoader
一旦你的ModelLoader和DataFetcher实现完成,你需要在Glide的配置中注册它们。
添加AppGlideModule:
创建一个继承自AppGlideModule的类,并在其中注册你的ModelLoader。
@GlideModule
public class CustomAppGlideModule extends AppGlideModule {@Overridepublic void registerComponents(Context context, Glide glide, Registry registry) {registry.prepend(String.class, ByteBuffer.class, new CustomModelLoaderFactory());}
}
实现ModelLoaderFactory:
创建一个工厂类,实现ModelLoaderFactory接口,用于创建你的ModelLoader。
public class CustomModelLoaderFactory implements ModelLoaderFactory<String, ByteBuffer> {@Overridepublic ModelLoader<String, ByteBuffer> build(MultiModelLoaderFactory multiFactory) {return new CustomModelLoader();}@Overridepublic void teardown() {// 清理资源,如果有必要的话}
}
注册ModelLoader:
在你的AppGlideModule的registerComponents方法中,使用prepend或replace方法将你的ModelLoader添加到Glide的注册表中。
@Override
public void registerComponents(Context context, Glide glide, Registry registry) {registry.prepend(String.class, ByteBuffer.class, new CustomModelLoaderFactory());
}
完整源码
// CustomModelLoader.java
package com.example.myapp;import android.support.annotation.Nullable;
import com.bumptech.glide.load.Options;
import com.bumptech.glide.load.model.ModelLoader;
import com.bumptech.glide.load.model.ModelLoaderFactory;
import com.bumptech.glide.load.model.MultiModelLoaderFactory;
import java.nio.ByteBuffer;
import java.util.Base64;/*** CustomModelLoader loads a ByteBuffer from a Base64 encoded String.*/
public class CustomModelLoader implements ModelLoader<String, ByteBuffer> {@Nullable@Overridepublic LoadData<ByteBuffer> buildLoadData(String model, int width, int height, Options options) {return new LoadData<>(new ObjectKey(model), new CustomDataFetcher(model));}@Overridepublic boolean handles(String model) {return model.startsWith("data:image/;base64,");}
}
// CustomDataFetcher.java
package com.example.myapp;import android.support.annotation.NonNull;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.data.DataFetcher;
import com.bumptech.glide.load.data.DataCallback;
import java.nio.ByteBuffer;/*** CustomDataFetcher fetches data from a Base64 encoded String.*/
public class CustomDataFetcher implements DataFetcher<ByteBuffer> {private final String model;public CustomDataFetcher(String model) {this.model = model;}@Overridepublic void loadData(@NonNull Priority priority, @NonNull DataCallback<? super ByteBuffer> callback) {try {// Decode the Base64 string to a byte arraybyte[] bytes = Base64.decode(model.split(",")[1], Base64.DEFAULT);// Wrap the byte array in a ByteBufferByteBuffer byteBuffer = ByteBuffer.wrap(bytes);// Call onDataReady with the ByteBuffercallback.onDataReady(byteBuffer);} catch (Exception e) {// Handle exceptions, possibly by calling callback.onLoadFailed()}}@Overridepublic void cleanup() {// Clean up resources if necessary}@Overridepublic void cancel() {// Cancel the data fetching process if possible}@NonNull@Overridepublic Class<ByteBuffer> getDataClass() {return ByteBuffer.class;}@NonNull@Overridepublic DataSource getDataSource() {return DataSource.LOCAL;}
}
// CustomAppGlideModule.java
package com.example.myapp;import android.content.Context;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;
import com.bumptech.glide.module.Registry;/*** CustomAppGlideModule registers the CustomModelLoader.*/
@GlideModule
public class CustomAppGlideModule extends AppGlideModule {@Overridepublic void registerComponents(Context context, Glide glide, Registry registry) {registry.prepend(String.class, ByteBuffer.class, new CustomModelLoaderFactory());}
}
// CustomModelLoaderFactory.java
package com.example.myapp;import com.bumptech.glide.load.model.ModelLoader;
import com.bumptech.glide.load.model.ModelLoaderFactory;
import com.bumptech.glide.load.model.MultiModelLoaderFactory;/*** CustomModelLoaderFactory creates instances of CustomModelLoader.*/
public class CustomModelLoaderFactory implements ModelLoaderFactory<String, ByteBuffer> {@Overridepublic ModelLoader<String, ByteBuffer> build(MultiModelLoaderFactory multiFactory) {return new CustomModelLoader();}@Overridepublic void teardown() {// Perform any necessary cleanup}
}
相关文章:
Glide系列-自定义ModuleLoader
在当今快速发展的移动应用领域,图片的高效加载和显示对于提供流畅用户体验至关重要。Glide作为一款强大的图片加载库,已经成为Android开发者的首选工具之一。但是,你有没有遇到过Glide默认不支持的模型类型,或者需要对图片加载过程…...

设计模式——责任链模式13
责任链模式 每个流程或事物处理 像一个链表结构处理。场景由 多层部门审批,问题分级处理等。下面体现的是 不同难度的问题由不同人进行解决。 设计模式,一定要敲代码理解 传递问题实体 /*** author ggbond* date 2024年04月10日 07:48*/ public class…...

Linux云计算之Linux基础3——Linux系统基础part-2
1、终端、shell、文件理论 1、终端 终端(terminal):人和系统交互的必要设备,人机交互最后一个界面(包含独立的输入输出设备) 物理终端(console):直接接入本机器的键盘设备和显示器虚拟终端(tty):通过软件…...

HBase详解(2)
HBase 结构 HRegion 概述 在HBase中,会从行键方向上对表来进行切分,切分出来的每一个结构称之为是一个HRegion 切分之后,每一个HRegion会交给某一个HRegionServer来进行管理。HRegionServer是HBase的从节点,每一个HRegionServ…...

Web后端搭建
目录 一 搭建服务器端 1.1安装服务器软件 1.2检查环境是否配置 1.3安装Tomcat 二 创建并发Web项目 2.1创建一个java项目 三 创建Servlet 前端程序如何才能访问到后端程序呢,这时候我们就需要web服务器来解决:将后端程序部署到服务器中,…...

k8s单节点部署,容器运行时使用containerd
环境 系统 : entOS Linux release 7.9.2009 (CoreIP:192.168.44.177 硬件要求:控制平面最少需要 2c2g 安装前环境准备 如果是集群部署还需要配置时间同步 关闭防火墙 systemctl disable firewalld关闭selinux setenforce 0sed -i s/SELI…...
深入浅出 -- 系统架构之性能优化的核心思维
“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。Java语言作为企业应用中的…...

Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
很奇怪的问题,在使用nifi的时候碰到的,这里是用NIFI,把数据从postgresql中同步到mysql中, 首先postgresql中的源表,中是没有create_time这个字段的,但是同步的过程中报错了. 报错的内容是说,目标表中有个create_time字段,这个字段是必填的,但是传过来的flowfile文件中,的数据没…...
批量删除文件脚本
在工作中我们经常会遇到一些重复性的工作,如批量创建文件,删除文件等等。这种重复性的工作shell脚本往往能给我们带来极大的便利。 将需要删除的文件路径存放在【stt_Files_240410.rpt】随便一个 文档中即可。 下面是一个批量删除文件的一个脚本范例&…...

蓝桥杯物联网竞赛_STM32L071KBU6_我的全部省赛及历年模拟赛源码
我写的省赛及历年模拟赛代码 链接:https://pan.baidu.com/s/1A0N_VUl2YfrTX96g3E8TfQ?pwd9k6o 提取码:9k6o...
微服务和K8S
微服务和Kubernetes(通常简称为K8s)都是现代软件开发和部署中常用的概念和工具。它们有着各自独特的特点和作用: 1. **微服务**: - **定义**:微服务是一种架构设计风格,将应用程序拆分为一组小型、独立…...

Ant Design 表单基础用法综合示例
Ant Design 的表单组件设计得非常出色,极大地简化了表单开发的复杂度,让开发者能够快速构建出功能丰富、交互友好的表单界面。 接下来总结一下 Ant Design 中表单的基本用法。 Form 组件 用于定义整个表单,可以设置表单的布局方式、提交行为等。通常会将表单字段组件嵌套在 F…...

MWeb Pro For Mac v4.5.9 强大的 Markdown 软件中文版
MWeb 是专业的 Markdown 写作、记笔记、静态博客生成软件,目前已支持 Mac,iPad 和 iPhone。MWeb 有以下特色: 软件下载:MWeb Pro For Mac v4.5.9 软件本身: 使用原生的 macOS 技术打造,追求与系统的完美结合…...
Git常用命令详解:掌握版本控制的核心操作
Git作为世界上最流行的分布式版本控制系统,以其强大的分支管理、高效的协同工作能力和完善的版本追溯功能,深受广大开发者喜爱。熟练掌握Git的常用命令是每一位程序员必备的技能。本文将深入解析Git中那些最为基础且实用的命令,助您在日常开发…...
Vue链接跳转地址 href 中有参数带有#
Vue链接跳转地址 href 中有参数带有# A跳转B 带参数backURL 转码一次会被浏览器解码 xxxx?backurlencodeURIComponent(url) 到B页面拿到的query 值取不到 需要对地址转码两次才能取值成功 xxxx?backurlencodeURIComponent(encodeURIComponent(url))...
python 会员信息管理系统2.0
问题介绍 综合案例实现:会员管理系统设计与实现-V3 利用所学习的知识点 ,结合会员管理系统的分析与实现, 了解面向对象开发过程中类内部功能的分析方法,系统讲解 Python语法、控制结构、四种典型序列 ,函数定义以及面向对象语法和模块的应用…...
HTTP的强制缓存和协商缓存
HTTP的强制缓存和协商缓存 HTTP的缓存技术强制缓存ExpiresCache-Control 协商缓存If-Modified-Since和Last-ModifiedIf-None-Match和ETag优先级 可被缓存的请求方法总结 HTTP的缓存技术 当我们进行HTTP请求时,需要将请求报文发送给对端,当服务端收到请求…...

Prometheus-Grafana基础篇安装绘图
首先Prometheus安装 1、下载 https://prometheus.io/download/ 官网路径可以去这儿下载 2、如图: 3.解压: tar -xf prometheus-2.6.1.linux-amd64 cd prometheus-2.6.1.linux-amd64 4.配置文件说明: vim prometheus.yml 5.启动Promethe…...

探索艺术的新领域——3D线上艺术馆如何改变艺术作品的传播方式
在数字化时代的浪潮下,3D线上艺术馆成为艺术家们展示和传播自己作品的新平台。不仅突破了地域和物理空间的限制,还提供了全新的互动体验。 一、无界限的展示空间:艺术家的新展示平台 3D线上艺术馆通过数字化技术,为艺术家提供了一…...

[dvwa] file upload
file upload 0x01 low 直接上传.php 内容写<? eval($_POST[jj]);?> 用antsword连 路径跳两层 0x02 medium 添加了两种验证,格式为图片,大小限制小于1000 上传 POST /learndvwa/vulnerabilities/upload/ HTTP/1.1 Host: dvt.dv Content-Le…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...