Flutter extended_image库设置内存缓存区大小与缓存图片数

 

 

ExtendedImage

`ExtendedImage` 是一个Flutter库,用于提供高级图片加载和显示功能。这个库使用了 `image` 包来进行图片的加载和缓存。如果你想修改缓存大小,你可以通过修改`ImageCache`的配置来实现。

1. 获取`ImageCache`实例:
   你可以通过`PaintingBinding.instance.imageCache`获取到全局的`ImageCache`实例。

2. 修改缓存配置:
   你可以通过修改`maximumSize`和`maximumSizeBytes`属性来调整缓存的数量和大小。

   - `maximumSize`: 缓存中最多可以存储的图片数量。
   - `maximumSizeBytes`: 缓存中图片总占用的最大字节数。

例如,如果你想将图片缓存的最大数量设置为100张,并且最大字节数设置为350MB,你可以这样做:

void main() {
  Global.init().then((_) => runApp(const MyApp()));
  //扩大imageCache的缓存
  PaintingBinding.instance.imageCache.maximumSize = 100;
  PaintingBinding.instance.imageCache.maximumSizeBytes = 350 << 20;  // 350MB

}

在`main`函数中进行设置确保在应用启动时就进行了配置。

注意:增加缓存大小会增加应用占用的内存,可能导致性能问题,特别是在内存有限的设备上。所以在调整这些设置时要谨慎,确保根据你的应用需求和目标设备的硬件规格来进行适当的配置。

使用上述方法设置全局的imageCache缓存逻辑,不设置的情况下,默认maximumSizeBytes 为100MB。默认100M在多张750宽高的图片列表中很快会回收掉划出屏幕的图片,用户超快速滑动时不够用。实测调整至350M左右开始效果明显改善。

maximumSizeBytes与磁盘缓存区大小的关系

`maximumSizeBytes` 设置的是 Flutter 的 `ImageCache` 对内存中的图片缓存所占用的最大字节大小。这个参数并不影响磁盘上的缓存大小。

在 Flutter 中,`ImageCache` 通常用于存储加载过的图片,以便快速再次访问。这些图片存储在应用的内存中,而不是磁盘上。当应用尝试加载新的图片时,`ImageCache` 会首先检查图片是否已经在缓存中。如果是,就可以直接从内存中加载图片,而无需再次从网络或磁盘加载,从而提高了性能。

设置 `maximumSizeBytes` 的目的是为了防止应用占用过多的内存来存储图片,特别是在加载大量或高分辨率图片的应用中。一旦缓存的大小超过了这个限制,`ImageCache` 就会根据一定的策略(如最近最少使用(LRU)策略)开始淘汰一些图片,释放内存。

如果你需要设置磁盘缓存的大小,你需要使用 Flutter 的网络库(如 `dio` 或 `http`)结合一个磁盘缓存库(如 `flutter_cache_manager`)来实现。这通常涉及到将下载的文件保存到设备的文件系统,并在需要时从那里加载它们。

在原生Android Glide库对于缓存的配置情况

Glide 默认使用的是 `InternalCacheDiskCacheFactory`,这个工厂会为 Glide 创建一个内部磁盘缓存,缓存的图片位于应用的内部存储空间中。默认情况下,Glide 会为其磁盘缓存分配 250 MB 的空间。

缓存大小的计算逻辑大致如下:

1. 内存缓存:Glide 会使用应用可用内存的一定比例来作为内存缓存。默认情况下,Glide 使用 `LruBitmapPool` 和 `LruResourceCache`,并且默认分配的大小基于 `MemorySizeCalculator` 类计算得出。`MemorySizeCalculator` 会考虑设备的可用内存和屏幕分辨率。

2. 磁盘缓存:对于磁盘缓存,默认情况下 Glide 使用 `InternalCacheDiskCacheFactory`,并分配 250 MB 的空间。这个值是在 `DiskLruCacheWrapper` 类中定义的。

如果你想要自定义这些缓存大小,你可以创建一个自定义的 `GlideModule`,并在 `applyOptions` 方法中使用 `MemorySizeCalculator.Builder` 来设置不同的内存缓存大小,以及使用 `InternalCacheDiskCacheFactory` 或 `ExternalPreferredCacheDiskCacheFactory` 来设置不同的磁盘缓存大小。

例如:

@Override
public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
    MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context)
        .setMemoryCacheScreens(2)
        .setBitmapPoolScreens(3)
        .build();
    builder.setMemorySizeCalculator(calculator);
    builder.setDiskCache(new InternalCacheDiskCacheFactory(context, 100 * 1024 * 1024));
}

在这个示例中,内存缓存大小被设置为屏幕大小的两倍,位图池大小被设置为屏幕大小的三倍,磁盘缓存大小被设置为 100 MB。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

css 雷达扫描图

html 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>css 雷达扫描</title><style>* {margin: 0;padding: 0;}body {background: #000000;height: 100vh;display: flex;align-items…

Java基础总结

0、Java语言 1.java和c 2.编译和解释 3.jre和jdk&#xff0c;jvm 简单来说&#xff0c;编译型语言是指编译器针对特定的操作系统将源代码一次性翻译成可被该平台执行的机器码&#xff1b;解释型语言是指解释器对源程序逐行解释成特定平台的机器码并立即执行。 Java 语言既具…

【单片机学习笔记】Windows+Vscode+STM32F4+freeRTOS+FatFs gcc环境搭建

为摒弃在接受keil邮件&#xff0c;研究了下gun编译&#xff0c;以STM32F407为例&#xff0c;简单记录 1. 软件包准备 Git 选择对应版本直接安装即可https://git-scm.com/download/winmakegcc ​ 1&#xff09;将上述软件包放置于C盘根目录 2&#xff09;添加环境变量 3&am…

[SpringCloud] Eureka 与 Ribbon 简介

目录 一、服务拆分 1、案例一&#xff1a;多端口微服务 2、案例二&#xff1a;服务远程调用 二、Eureka 1、Eureka 原理分析 2、Eureka 服务搭建&#xff08;注册 eureka 服务&#xff09; 3、Eureka 服务注册&#xff08;注册其他服务&#xff09; 4、Eureka 服务发现…

鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

【组合计数】CF1866 H

Problem - H - Codeforces 题意 思路 不知道这种trick叫什么&#xff0c;昨天VP刚遇到过 设 f[x] 为恰好有一个最大值为 x 的方案数&#xff0c;我们要求这个&#xff0c;那就设 g[x] 为 至少有一个最大值为 x 的方案数&#xff0c;那么答案就是 f[x] g[x] - g[x - 1] 这里…

FL Studio21版无限破解版下载 软件内置破解补丁

FL Studio是一款非常好用方便的音频媒体制作工具&#xff0c;它的功能是非常的强大全面的&#xff0c;想必那些喜欢音乐创作的朋友们应该都知道这款软件是多么的好用吧&#xff0c;它还能够给用户们带来更多的创作灵感&#xff0c;进一步加强提升我们的音乐制作能力。该软件还有…

浅谈uniapp中开发安卓原生插件

其实官方文档介绍的比较清楚而且详细,但是有时候他太墨迹,你一下子找不到自己想要的,所以我总结了一下开发的提纲,也是为了自己方便下次使用。 1.第一步,下载官方提供的Android的示例工程,然后倒入UniPlugin-Hello-AS工程请在App离线SDK中查找,之后Android studio,编译运行项目…

Android Studio Gradle中没有Task任务,没有Assemble任务,不能方便导出aar包

Gradle中&#xff0c;没有Assemble任务 1. 在编译aar包或者编译module的时候&#xff0c;没有release包&#xff0c;我们一般都是通过assemble进行编译。 如果在Gradle中找不到task。 可以通过设置File->setting -->Experimental→取消勾选“Do not build Gradle task …

wordpress数据库迁移Invalid default value for ‘comment_date‘

问题说明 最近在往新的电脑上迁移一个wordpress网站&#xff0c;在往新电脑上的mysql数据库中导入数据时&#xff0c;报错&#xff1a;1067 - Invalid default value for comment_date。 异常分析 这个错误的字面意思就是字段‘comment_date’的默认值是无效的&#xff0c;于…

Flink将数据写入MySQL(JDBC)

一、写在前面 在实际的生产环境中&#xff0c;我们经常会把Flink处理的数据写入MySQL、Doris等数据库中&#xff0c;下面以MySQL为例&#xff0c;使用JDBC的方式将Flink的数据实时数据写入MySQL。 二、代码示例 2.1 版本说明 <flink.version>1.14.6</flink.version…

UE5 Blueprint发送http请求

一、下载插件HttpBlueprint、Json Blueprint Utilities两个插件是互相依赖的&#xff0c;启用&#xff0c;重启项目 目前两个是Beta的状态&#xff0c;如果你使用的平台支持就可以使用&#xff0c;我们的项目因为需要取Header的值&#xff0c;所有没法使用这两个插件&#xff0…

单链表的定义(数据结构与算法)

单链表的定义 单链表是一种常见的数据结构&#xff0c;用于存储元素的序列。它由一系列节点组成&#xff0c;每个节点包含一个数据元素和一个指向下一个节点的引用&#xff08;指针&#xff09;。单链表中的节点之间通过指针连接起来&#xff0c;形成一个线性结构。单链表是一种…

【Elasticsearch】es脚本编程使用详解

目录 一、es脚本语言介绍 1.1 什么是es脚本 1.2 es脚本支持的语言 1.3 es脚本语言特点 1.4 es脚本使用场景 二、环境准备 2.1 docker搭建es过程 2.1.1 拉取es镜像 2.1.2 启动容器 2.1.3 配置es参数 2.1.4 重启es容器并访问 2.2 docker搭建kibana过程 2.2.1 拉取ki…

Git的远程仓库

Git的远程仓库 添加远程仓库从远程库克隆 添加远程仓库 你在本地创建了一个Git仓库后&#xff0c;又想在GitHub创建一个Git仓库&#xff0c;并且让这两个仓库进行远程同步&#xff0c;这样&#xff0c;GitHub上的仓库既可以作为备份&#xff0c;又可以让其他人通过该仓库来协作…

如何在VScode中让printf输出中文

如何在VScode中让printf输出中文&#xff1f; 1、在“Visual Studio Code”图标上右击&#xff0c;弹出对话框。见下图&#xff1a; 2、点击“以管理员身份运行”&#xff0c;得到下图&#xff1a; 3、点击“UTF-8”按钮&#xff0c;得到下图&#xff1a; 4、点击“通过编码重…

Python---练习:使用for循环嵌套实现打印九九乘法表

思考&#xff1a; 外层循环主要用于控制循环的行数&#xff0c;内层循环用于控制列数。 基本语法&#xff1a; # 外层循环 for i in 序列1:# 内层循环for j in 序列2:循环体 序列1 序列2 &#xff0c;就可以是range(1, 10) -----也就是从1&#xff0c;到9。 参考while循环…

【vector题解】杨辉三角 | 删除有序数组中的重复项 | 只出现一次的数字Ⅱ

杨辉三角 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1…

动态规划(记忆化搜索)

AcWing 901. 滑雪 给定一个 R行 C 列的矩阵&#xff0c;表示一个矩形网格滑雪场。 矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。 一个人从滑雪场中的某个区域内出发&#xff0c;每次可以向上下左右任意一个方向滑动一个单位距离。 当然&#xff0c;一个人能…