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

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。

相关文章:

  • 深入理解NLP
  • 基于单片机的空气质量检测系统
  • 接口测试 —— Requests库GET请求!
  • order by数据过多引起的cpu飙升
  • Web:探索 SpreadJS强大的在线电子表格库
  • 云原生之深入解析如何合并多个kubeconfig文件
  • Linux下protobuf和 protobuf-c安装使用
  • IP地址与代理ip在网络安全中的关键作用
  • Autojs 利用OpenCV识别棋子之天天象棋你马没了
  • Spigot 通过 BuildTools 构建 MineCraft Spigot 官方服务端文件
  • 代码随想录算法训练营第3天| 203.移除链表元素 、 707.设计链表 、 206.反转链表
  • 【Acwing167】木棒(dfs+剪枝)超级详细题解!
  • 【数据库】组合查询 UNION
  • Spring Cloud之微服务
  • 微信小程序笔记功能(富文本editor功能)开发
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • extract-text-webpack-plugin用法
  • Git初体验
  • in typeof instanceof ===这些运算符有什么作用
  • oschina
  • VUE es6技巧写法(持续更新中~~~)
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 程序员该如何有效的找工作?
  • 从重复到重用
  • 大数据与云计算学习:数据分析(二)
  • 动态魔术使用DBMS_SQL
  • 关于使用markdown的方法(引自CSDN教程)
  • 基于组件的设计工作流与界面抽象
  • 技术发展面试
  • 简单基于spring的redis配置(单机和集群模式)
  • 如何学习JavaEE,项目又该如何做?
  • 实现简单的正则表达式引擎
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​水经微图Web1.5.0版即将上线
  • ​用户画像从0到100的构建思路
  • #1014 : Trie树
  • #预处理和函数的对比以及条件编译
  • (3)nginx 配置(nginx.conf)
  • (3)STL算法之搜索
  • (4) PIVOT 和 UPIVOT 的使用
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (八)c52学习之旅-中断实验
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (四)库存超卖案例实战——优化redis分布式锁
  • (五)c52学习之旅-静态数码管
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转载)Google Chrome调试JS
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET gRPC 和RESTful简单对比
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net 中viewstate的原理和使用
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .net开发时的诡异问题,button的onclick事件无效