当前位置: 首页 > news >正文

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

在当今快速发展的移动应用领域&#xff0c;图片的高效加载和显示对于提供流畅用户体验至关重要。Glide作为一款强大的图片加载库&#xff0c;已经成为Android开发者的首选工具之一。但是&#xff0c;你有没有遇到过Glide默认不支持的模型类型&#xff0c;或者需要对图片加载过程…...

设计模式——责任链模式13

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

Linux云计算之Linux基础3——Linux系统基础part-2

1、终端、shell、文件理论 1、终端 终端(terminal)&#xff1a;人和系统交互的必要设备&#xff0c;人机交互最后一个界面&#xff08;包含独立的输入输出设备&#xff09; 物理终端(console)&#xff1a;直接接入本机器的键盘设备和显示器虚拟终端(tty)&#xff1a;通过软件…...

HBase详解(2)

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

Web后端搭建

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

k8s单节点部署,容器运行时使用containerd

环境 系统 &#xff1a; entOS Linux release 7.9.2009 (CoreIP&#xff1a;192.168.44.177 硬件要求&#xff1a;控制平面最少需要 2c2g 安装前环境准备 如果是集群部署还需要配置时间同步 关闭防火墙 systemctl disable firewalld关闭selinux setenforce 0sed -i s/SELI…...

深入浅出 -- 系统架构之性能优化的核心思维

“在当前的互联网开发模式下&#xff0c;系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至&#xff0c;性能优化成为了现时代开发过程中炙手可热的名词&#xff0c;无论是在开发、面试过程中&#xff0c;性能优化都是一个常谈常新的话题”。Java语言作为企业应用中的…...

Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066

很奇怪的问题,在使用nifi的时候碰到的,这里是用NIFI,把数据从postgresql中同步到mysql中, 首先postgresql中的源表,中是没有create_time这个字段的,但是同步的过程中报错了. 报错的内容是说,目标表中有个create_time字段,这个字段是必填的,但是传过来的flowfile文件中,的数据没…...

批量删除文件脚本

在工作中我们经常会遇到一些重复性的工作&#xff0c;如批量创建文件&#xff0c;删除文件等等。这种重复性的工作shell脚本往往能给我们带来极大的便利。 将需要删除的文件路径存放在【stt_Files_240410.rpt】随便一个 文档中即可。 下面是一个批量删除文件的一个脚本范例&…...

蓝桥杯物联网竞赛_STM32L071KBU6_我的全部省赛及历年模拟赛源码

我写的省赛及历年模拟赛代码 链接&#xff1a;https://pan.baidu.com/s/1A0N_VUl2YfrTX96g3E8TfQ?pwd9k6o 提取码&#xff1a;9k6o...

微服务和K8S

微服务和Kubernetes&#xff08;通常简称为K8s&#xff09;都是现代软件开发和部署中常用的概念和工具。它们有着各自独特的特点和作用&#xff1a; 1. **微服务**&#xff1a; - **定义**&#xff1a;微服务是一种架构设计风格&#xff0c;将应用程序拆分为一组小型、独立…...

Ant Design 表单基础用法综合示例

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

MWeb Pro For Mac v4.5.9 强大的 Markdown 软件中文版

MWeb 是专业的 Markdown 写作、记笔记、静态博客生成软件&#xff0c;目前已支持 Mac&#xff0c;iPad 和 iPhone。MWeb 有以下特色&#xff1a; 软件下载&#xff1a;MWeb Pro For Mac v4.5.9 软件本身&#xff1a; 使用原生的 macOS 技术打造&#xff0c;追求与系统的完美结合…...

Git常用命令详解:掌握版本控制的核心操作

Git作为世界上最流行的分布式版本控制系统&#xff0c;以其强大的分支管理、高效的协同工作能力和完善的版本追溯功能&#xff0c;深受广大开发者喜爱。熟练掌握Git的常用命令是每一位程序员必备的技能。本文将深入解析Git中那些最为基础且实用的命令&#xff0c;助您在日常开发…...

Vue链接跳转地址 href 中有参数带有#

Vue链接跳转地址 href 中有参数带有# A跳转B 带参数backURL 转码一次会被浏览器解码 xxxx?backurlencodeURIComponent(url) 到B页面拿到的query 值取不到 需要对地址转码两次才能取值成功 xxxx?backurlencodeURIComponent(encodeURIComponent(url))...

python 会员信息管理系统2.0

问题介绍 综合案例实现&#xff1a;会员管理系统设计与实现-V3 利用所学习的知识点 ,结合会员管理系统的分析与实现&#xff0c; 了解面向对象开发过程中类内部功能的分析方法&#xff0c;系统讲解 Python语法、控制结构、四种典型序列 ,函数定义以及面向对象语法和模块的应用…...

HTTP的强制缓存和协商缓存

HTTP的强制缓存和协商缓存 HTTP的缓存技术强制缓存ExpiresCache-Control 协商缓存If-Modified-Since和Last-ModifiedIf-None-Match和ETag优先级 可被缓存的请求方法总结 HTTP的缓存技术 当我们进行HTTP请求时&#xff0c;需要将请求报文发送给对端&#xff0c;当服务端收到请求…...

Prometheus-Grafana基础篇安装绘图

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

探索艺术的新领域——3D线上艺术馆如何改变艺术作品的传播方式

在数字化时代的浪潮下&#xff0c;3D线上艺术馆成为艺术家们展示和传播自己作品的新平台。不仅突破了地域和物理空间的限制&#xff0c;还提供了全新的互动体验。 一、无界限的展示空间&#xff1a;艺术家的新展示平台 3D线上艺术馆通过数字化技术&#xff0c;为艺术家提供了一…...

[dvwa] file upload

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

pygame发射子弹后绘制射线

import pygame import sys import mathpygame.init()screen pygame.display.set_mode((800, 600)) pygame.display.set_caption("Rotate and Shoot Bullets")# 定义子弹类 class Bullet:def __init__(self, x, y, angle):self.x xself.y yself.angle angleself.s…...

逻辑回归都有什么类型

逻辑回归是一种用于解决分类问题的统计学习方法&#xff0c;它基于概率理论&#xff0c;将输入特征与输出类别之间的关系建模为一个概率分布。逻辑回归模型可以用不同的方法来表示&#xff0c;其中包括&#xff1a; 1. **基本逻辑回归模型**&#xff1a;最简单的逻辑回归模型假…...

基于springboot+vue实现的高校宿舍管理系统(界面优美,十分推荐)

一、项目简介 本项目是一套基于springbootvue实现的高校宿舍管理系统设计与实现 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观…...

C语言学习笔记day18

1. 指针基本概念 1.地址:用来区分内存中不同字节的编号 2.指针:地址就是指针,指针就是地址 3.指针变量:存储指针的变量,有时去掉变量,称为指针 2. 指针运算符 1.&: 1.获得一个变量在内存空间中的首地址 2.让表达式类型升级 2.*: 1.取…...

JSP内置对象session

1.session对象&#xff0c;为会话对象&#xff0c;封装当前用户会话中的有关信息。 网页数据传递是单向传递的&#xff0c;session能够将数据进行多个数据互相传递&#xff0c;使用的是同一个东西 实例1&#xff1a; 利用session对象String getId() 方法获取当前session对象…...

BM96 主持人调度(二)(贪心算法)

一开始写的时候忘了给start、end数组赋值了 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** 计算成功举办活动需要多少名主持人* param n int整型 有n个活动* param start…...

【TB作品】MSP430单片机读取大气压强传感器BMP180

文章目录 实物main所有代码 实物 main #include <msp430.h> #include "stdio.h" #include "OLED.h"#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h>// P2.2 oled scl // P2.3 oled sda// p…...

Github第一Star数的国产免费开源防火墙--雷池社区版初步体验

前言 近期准备搭建一个博客网站&#xff0c;用来存储工作室同学们的学习笔记。服务器准备直接放在公网上&#xff0c;方便大家随时随地的上传和浏览&#xff0c;为了防止网站被人日穿成为肉鸡&#xff0c;一些防御措施还是要部署的。 首先明确自己的需求&#xff1a; 零成本…...

自动驾驶涉及相关的技术

自动驾驶涉及多种技术&#xff0c;包括传感器、数据处理、决策制定和执行控制等方面。以下是一些关键技术的详细说明&#xff1a; 传感器技术&#xff1a; 激光雷达&#xff08;LiDAR&#xff09;&#xff1a;激光雷达通过发射激光束并测量其反射时间来获取周围环境的高精度三维…...

简单高效的GO发票识别+发票查验接口

在这个瞬息万变的商业世界里&#xff0c;商业欺诈如影随形&#xff0c;虚假发票成为企业难以忽视的风险。而发票作为每笔交易的重要凭证&#xff0c;对其进行入账前的真伪查验显得尤为重要。但面对海量的发票查验与发票录入工作&#xff0c;人工手动查验的方式&#xff0c;速度…...