glide ModelLoader的Key错误使用 可能造成的内存泄漏

news/2024/11/15 5:41:48/

glide_ModelLoaderKey__0">glide ModelLoader的Key错误使用 可能造成的内存泄漏

业务场景

之前项目性能优化,在自定义的AppGlideModule中的registerComponents方法append了自定义ModelLoaderFactory,然后有很多个File对象出现了内存泄漏,后面定位到以下场景,代码如下:

kotlin">import com.bumptech.glide.load.Options
import com.bumptech.glide.load.model.ModelLoader
import com.bumptech.glide.signature.ObjectKey
import com.fawvw.hmi.media.mediacommon.model.mediadata.AudioMediaData
import java.io.InputStreamclass AudioModuleLoader : ModelLoader<AudioMediaData, InputStream> {override fun buildLoadData(model: AudioMediaData,width: Int,height: Int,options: Options): ModelLoader.LoadData<InputStream> {val path = if (model.albumArt != null) {"${model.artist}${model.duration}${model.album}"} else {model.uri}return ModelLoader.LoadData(ObjectKey(path), AudioCoverFetcher(model))}//这里使用了AudioCoverSignaturereturn ModelLoader.LoadData(AudioCoverSignature(path), AudioCoverFetcher(model))}override fun handles(model: AudioMediaData) = true
}
kotlin">import com.bumptech.glide.load.Key
import java.io.File
import java.security.MessageDigestclass AudioCoverSignature(private val path:String): Key {private val stringBuilder by lazy {StringBuilder()}//这个file内存泄漏了private val file by lazy {File(path)}override fun updateDiskCacheKey(messageDigest: MessageDigest) {stringBuilder.append(file.lastModified()).append(file.absolutePath)val bs = stringBuilder.toString().encodeToByteArray()messageDigest.update(bs, 0, bs.size)}
}

泄露的原因是因为,AudioCoverSignature类只重写了updateDiskCacheKey方法,没有重写equals方法,而ModelLoader.LoadData方法的入参key是用来找缓存的,每一个都找不到,导致内存泄漏

kotlin">  /*** Contains a set of {@link com.bumptech.glide.load.Key Keys} identifying the source of the load,* alternate cache keys pointing to equivalent data, and a {@link* com.bumptech.glide.load.data.DataFetcher} that can be used to fetch data not found in cache.** @param <Data> The type of data that well be loaded.*/class LoadData<Data> {public final Key sourceKey;public final List<Key> alternateKeys;public final DataFetcher<Data> fetcher;...

解决方法

将自定义AudioCoverSignature删除,使用ObjectKey解决此问题

kotlin">import com.bumptech.glide.load.Options
import com.bumptech.glide.load.model.ModelLoader
import com.bumptech.glide.signature.ObjectKey
import com.fawvw.hmi.media.mediacommon.model.mediadata.AudioMediaData
import java.io.InputStreamclass AudioModuleLoader : ModelLoader<AudioMediaData, InputStream> {override fun buildLoadData(model: AudioMediaData,width: Int,height: Int,options: Options): ModelLoader.LoadData<InputStream> {val path = if (model.albumArt != null) {"${model.artist}${model.duration}${model.album}"} else {model.uri}//这里使用ObjectKeyreturn ModelLoader.LoadData(ObjectKey(path), AudioCoverFetcher(model))}override fun handles(model: AudioMediaData) = true
}

问题解决了


http://www.ppmy.cn/news/1546485.html

相关文章

利用huffman树实现对文件A先编码后解码

利用huffman树实现对文件A先编码后解码&#xff0c;范围为ASCII码0-255的值&#xff0c;如何解决特殊符号问题是一个难点&#xff0c;注意应使用unsigned char存储数据&#xff0c;否则ASCII码128-255的值可能会出问题&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #includ…

使用Matlab建立随机森林

综述 除了神经网络模型以外&#xff0c;树模型及基于树的集成学习模型是较为常用的效果较好的预测模型。我们以下构建一个随机森林模型。 随机森林是一种集成学习方法&#xff0c;通过构建多个决策树并结合其预测结果来提高模型的准确性和稳定性。在MATLAB中&#xff0c;可以…

HTML基础内容(详细版)

HTML 基础 HTML&#xff08;超文本标记语言&#xff0c;HyperText Markup Language&#xff09;是一种用于创建和设计网页的标准标记语言。它通过标签&#xff08;tags&#xff09;来定义网页的结构和内容。 基本HTML结构 常用HTML标签 1.标题标签&#xff1a; <h1> …

Win vscode 配置OpenGL时 undefined reference to `glfwInit‘

Win vscode 配置OpenGL时 undefined reference to glfwInit Win vscode 配置OpenGL时 undefined reference to glfwInit现象原因解决方案 Win vscode 配置OpenGL时 undefined reference to glfwInit’ 现象 win 上面用vscode 配置OpenGL 时会报一下错误 g -stdc17 -Wall -We…

rust模式和匹配

文章目录 match 分支参考 match 分支 所有结果都得匹配到 // Match Expressionfn main() {#[derive(Debug)]enum Language {English,Spanish,Russian,Japanese,}let language Language::English;match language {Language::English > println!("Hello World!")…

java ssm 个人学习管理系统 学习安排 学生在线学习管理 源码 jsp

一、项目简介 本项目是一套基于SSM的个人学习管理系统&#xff0c;主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本、软件工具等。 项目都经过严格调试&#xff0c;确保可以运行&#xff01; 二、技术实现 ​后端技术&#x…

Vue中如何构建组件,支持传参、插槽等功能。

目录 1. 创建基本的Vue组件 2. 使用组件 3. 支持插槽 3.1 默认插槽 3.2 使用插槽 4. 作用域插槽 5. 使用作用域插槽 总结 在Vue.js中&#xff0c;组件是构建UI的基本单元&#xff0c;通过组件可以实现代码的复用和组织。以下是如何编写可复用的Vue组件的详细步骤&#…

vue3 + naive ui card header 和 title 冲突 bug

背景描述 最近发现一个 naive ui 上的问题&#xff0c;之前好好的&#xff0c;某一次升级后就出现了一个 bug&#xff0c;Modal 使用 card 布局后&#xff0c;Header Solt 下面的内容不见了&#xff0c;变成了 title&#xff0c;因为这个 solt 里面是有操作 action 的&#xf…