【问题标题】:Best Practice when Caching files in Android在 Android 中缓存文件时的最佳实践
【发布时间】:2011-04-01 23:41:07
【问题描述】:

我目前在应用程序的cache 子目录中缓存图像文件。图像在ListView 中使用并存储在SoftReferencesBitmapsHashMap 中。

所以我的问题是,在不增加应用程序使用空间的情况下缓存这些图像文件的最佳方法是什么,并且从用户的角度来看仍然保持响应。

我担心的事情:

我知道用户可以清除缓存,并且当内存空间不足时它会自动完成,但我觉得大多数用户会看到几个 MB 的应用程序并卸载它。此外,如果空间一直很低,我的应用程序将继续下载图像,使其看起来更慢。

大部分设备都预装了 SD 卡,但是没有插入怎么办?与内部存储相比,SD 卡也可能较慢,影响我的应用程序的性能。

我应该包含一个选项来选择缓存的位置吗?

我应该尝试管理我的缓存的大小(无论是在 /cache 还是 /sdcard 中)还是直接忘记它?

感谢您的宝贵时间(我知道它很长),请发布任何相关经验。

【问题讨论】:

    标签: android image caching memory-management


    【解决方案1】:

    我无法为您提供一套全面的最佳实践,但我可以提供我迄今为止所学到的知识:

    管理缓存是个好主意。我的应用程序的缓存是这样的,我知道我永远不需要超过一定数量的缓存文件,所以每当我将新文件插入缓存时,我都会删除最旧的文件,直到我低于我设置的限制。您可以根据大小或仅根据年龄做类似的事情。

    如果您的缓存需要占用大量空间,缓存到 SD 卡(如果可用)是一个好主意。您需要小心管理该空间,因为它不会自动为您清除该空间。如果要缓存图像文件,请确保将它们放在以点开头的目录中,例如“/yourAppHere/.cache”。这将阻止图像显示在图库中,这真的很烦人。

    让用户选择缓存的位置对我来说似乎有些矫枉过正,但如果您的受众非常怪异,可能会受到赞赏。

    缓存到 SD 时我没有注意到太多的惩罚,但我不知道您的应用如何使用该信息。

    【讨论】:

    • 我喜欢你关于阻止画廊看到图像的想法。画廊会在什么条件下接他们?我还没有看到随机图片,我知道我的手机上有一些像 twidroid 这样的应用程序可以缓存它们。
    • @chris324 查看标题为“保存应该共享的文件”下的developer.android.com/guide/topics/data/…
    • @Eric 感谢您的链接,看起来带有名为 .nomedia 的空文件的外部目录将被 mediascanner 忽略。看起来 getExternalCacheDir() 是 2.2 中的新功能,这将很有用。
    • 啊,我不知道 .nomedia。在图库中显示的将图像加载到 SD 卡的一些应用程序是“我的地图编辑器”(由 Google 提供,不少于!)、CauseWorld 以及我尝试过的至少一个音乐应用程序。从那时起,我仍然安装的那些似乎已经解决了这个问题。
    • @BenTobin 这也让我烦恼了一段时间,这次谈话决定我做点什么。事实证明,从计算机创建 .nomedia 文件 (touch /Volumes/MYPHONESSDCARD/maps/mymaps/icons/.nomedia) 已从图库中删除了这些图像。
    【解决方案2】:

    每个人都有好主意。我喜欢使用SoftReference's 的想法,虽然我不确定它们多久被清理一次,因为这在不同 VM 之间差异很大。您可能希望将其与常规 HashMap 结合使用,以防止每隔几分钟清除整个缓存。

    EclipseLink 有几个不同的缓存实现和pretty good documentation on them。您可能可以利用实现中的一些想法(例如,LRU、MRU 等)。例如,

    • 硬缓存
    • 软缓存
    • 组合硬/软缓存

    由于您正在将缓存调整到细节,我建议您根据硬规格将其调整到不同的设备。这通常是糟糕的设计,但是您的软件运行的硬件范围要求它,恕我直言。例如,

    • 检测 SD 卡上的可用内存量。大多数新的智能手机都配备了多 GB 的 SD 卡,对于大多数用户来说,这些卡很难满足日常使用的需求。用掉!您还可以在启动时检测 SD 卡上的可用空间量,并在启动时增加/减少缓存的大小。
    • 检测可用内存量并在此基础上配置缓存。如果用户使用的是硬件密集型应用程序,我认为他们不会介意它占用 200MB 的 RAM 并提供非常快的用户体验,特别是因为他们花了很多钱来拥有一部有 1 -2GB 内存。

    祝你好运!

    【讨论】:

    • 读起来很有趣。我喜欢使用组合的硬/软引用缓存的概念。不过,根据可用堆微调缓存大小对我来说似乎有点过头了,尤其是因为 VM 会在每部手机上为您提供大约相同的数量。
    • 在 Android 下使用 SoftReferences 要非常小心。 Android 系统会尽快清除它们,即使这不是 Java 标准提出的行为。而不是软引用,而是使用限制为可用内存一小部分的 LRU 缓存。 developer.android.com/training/displaying-bitmaps/…
    【解决方案3】:

    我应该包含一个选项来选择缓存的位置吗?

    IMO:不,让它尽可能简单(除非您可以包括专家用户的高级设置)

    我是否应该尝试管理缓存的大小(无论是在 /cache 或 /sdcard) 还是忘记它?

    IMO:这是可选的,它是双刃剑:您在后台的更多工作将帮助用户更方便,但也更容易出错

    使用第三个库: IMO使用第三个库作为毕加索更好,它按顺序自动处理缓存:内存缓存->磁盘缓存->网络

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 2010-10-31
      • 1970-01-01
      • 2016-08-05
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      相关资源
      最近更新 更多