1

我正在使用Jake Wharton 的 DiskLruCache库。

我对应用程序性能、缓存策略、在视图中和整个应用程序中使用缓存感到好奇。大多数时候,图像不会改变。

例如,假设我的服务器上有一张 320x320 的照片。我打开流,保存图像。

  1. 在我的列表视图中,我显示位图,在细节中,我显示更大的图像。我也应该保存缩略图位图吗?这样更有效率吗?

  2. 您在整个应用程序中共享缓存“对象”的经验是什么(假设我有多个可能利用相同数据的视图。这有什么问题?

  3. 为了性能和货币,如果图像在服务器上发生变化怎么办。知道它已经改变的最佳策略是什么?我无权访问修改日期。只有大小,但我也不想每次都查询大小。在服务器上的应用程序中设置一个标志,然后查询该标志?

    1. 在传统应用程序中(如果有这样的事情),不时清除缓存的最佳做法是什么?(缩进很奇怪。)

(在看到 Facebook 在 iOS 中的所有性能改进后,我受到启发,写了这篇文章。我没有数十亿的缓存要做,但我想至少聪明一点!哈哈)

4

1 回答 1

3

其中很多答案取决于您正在编写的应用程序的类型、图像更新的重要性(以及图像更改的可能性等)以及生成的总图像。除了磁盘缓存之外,您还应该使用内存缓存,尤其是在 ListView 和其他将重复滚动相同图像的区域中。查看LruCache并阅读 Google 的Caching Bitmaps条目。

320x320 对于列表视图来说可能太大了,您可能想要创建缩略图(取决于设备,以及您实现列表视图的方式)。

1)您应该相当积极地使用磁盘缓存(如何定义取决于您正在编写的应用程序)。使用外部存储目录,如果他们有几 GB 的剩余空间,例如,如果您的应用程序占用 100 mb,这不是问题。如果无论如何都需要,它可以全部清除。

2)应该没有问题。永远不应该在主线程上处理磁盘 IO(即使是闪存介质)。使用 AsyncTasks 加载图像。无论如何,一次只能有一个主要的前台活动,并且当活动处于休眠状态时,它不应该尝试从磁盘读取。

3)这又取决于你如何实现你的应用程序。检索文件时,您应该能够获得其他信息(甚至 Apache 也可以告诉您的应用程序的最后修改日期)。3.1)您可以拥有一个 sqllite 数据库来跟踪某些图像的使用频率以及最近的读取。如果最近一次阅读是几天前的,则让该图像过期。

编辑:有一个来自 Jake Wharton 的库,现在称为 Picasso,我建议使用它,它可以处理网络/本地 IO 以及内存和磁盘缓存。在这里检查一下:http: //square.github.io/picasso/。你需要做的很多事情都可以用一行来完成:Picasso.with(this).load(imageFileURL).into(imageView);

于 2012-09-27T15:53:23.130 回答