我正在使用Jake Wharton's DiskLruCache lib。
我对应用程序性能,缓存策略,在视图中和整个应用程序中使用缓存感到好奇。大多数情况下,图像不会改变。
比方说我的服务器上有一张320x320的照片。我打开流,保存图像。
在我的列表视图中,我显示了位图,在详细信息中,我显示了一个更大的图像。我也应该保存缩略图位图吗?这样效率更高吗?
您在整个应用程序中共享缓存“对象”的经验是什么(假设我有多个可能利用相同数据的视图。这有什么问题?
出于性能和货币的考虑,如果服务器上的图像发生了变化,该怎么办?知道它改变了的最佳策略是什么?我无权访问修改日期。只有尺寸,但我不想每次都查询大小。在服务器上的应用程序中设置一个标志,然后查询标志?
(在看到Facebook在iOS上的所有性能改进之后,我受到了启发。我没有数十亿人可以进行缓存,但我想至少对它很聪明!LOL)
答案 0 :(得分:3)
许多这些答案取决于您正在编写的应用程序类型,图像更新的重要程度(以及图像更改的可能性等)以及生成的总图像。除了磁盘缓存之外,您还应该使用内存缓存,尤其是在ListViews和其他重复滚动相同图像的区域。查看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);