首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在缓存目录中缓存本地和缓存

在缓存目录中缓存本地和缓存
EN

Stack Overflow用户
提问于 2020-10-01 10:53:01
回答 1查看 95关注 0票数 0

让我们假设我们希望缓存一组位图或任何数据。(我不需要应用程序死后的数据)我可以用两种方式来做

  • 缓存目录中的缓存
  • 在本地的Singleton类中存储相同的

哪个是首选,为什么?也是从记忆的角度来看,哪一种更有可能出现内存异常?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-01 11:50:46

为了采用最佳办法,需要考虑几个因素,因为这两种方法都是有效的,而且没有首选的办法,因为实际上是效率问题,也是基于具体情况的最佳办法。需要考虑的一些因素是,需要缓存多少位图、位图的大小、设备目标(低、中、高规格)等等。

也就是说,例如,如果我们讨论的是一组大或小的位图,那么最好的方法就是始终使用存储持久性。为此,大多数开发人员(甚至包括google或facebook)都使用现成的流行解决方案,比如滑翔壁画毕加索。这些库为您执行所有缓存,甚至处理图像缩放。

如果我们只讨论几个位图,那么就没有必要将它们缓存到文件中,您可以将它们保存在内存中。

请注意,如果选择缓存到内存中,则需要考虑的另一点是位图有多大,因为即使只有很少的大位图也可能引发OutOfMemoryError.。跟随此链接获得关于有效的位图加载的几个技巧。

如果你仍然不确定,那么你可以做数学计算。计算单个位图的大小,因此这将是宽度*高度*4(argb的4个字节),然后将结果乘以需要管理的位图数。这将给你你的位图占用的内存量。考虑到您仍然需要内存来执行应用程序的运行时。请记住,操作系统给您的应用程序有一个最大内存空间阈值,因为应用程序不能使用所有可用的设备内存。您可以通过设置largeHeap清单标志来增加允许的内存使用量。

评论回复您的评论:

谈到内存时,总是被称为实际的设备内存,而不是缓存文件目录(存储)。缓存到DB或文件目录与OutOfMemoryError无关。当有大量文件时,使用目录缓存,但在某些时候,您仍然需要将一些位图加载到内存(RAM)中,以便能够使用这些位图,此时您需要考虑内存管理,以避免内存错误。

此外,请考虑从文件中加载位图可能是一项昂贵的操作。这是由库解决的,比如上面提到的在后台线程中执行加载的库。

对于内存错误,您需要考虑其他因素,例如需要在RAM中准备多少位图,以便快速访问,计算所有位图大小,管理位图去分配(请参阅https://developer.android.com/reference/android/graphics/Bitmap#recycle(%29) _method in Android's documentation_,等等)。

总结了,当使用大量位图时,方法总是使用存储(文件)缓存,例如使用上面所示的库(滑翔壁画毕加索等),这些库将为您管理所有东西,文件加载和内存(RAM)。如果您只需要几个位图,那么最好是直接将它们缓存到内存中,并在不再使用时通过放行 (每个位图)动态地管理自己的内存。

如果不需要位图,而是需要管理一组非常大的让我们比如说字符串的集合,那么最好的方法是使用SQLite数据库,并通过游标访问它。对于一个小集合,然后使用一个内存(RAM)缓存。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64153878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档