我正在使用Jake Wharton's DiskLruCache lib。
我对应用程序性能,缓存策略,在视图中和整个应用程序中使用缓存感到好奇。大多数时候,图像不会改变。
例如,假设我的服务器上有一张320x320的照片。我打开流,保存图像。
在列表视图中,我显示位图,在细节中,我显示较大的图像。我也应该保存缩略图位图吗?这样更有效吗?
您在整个应用程序中共享缓存“对象”的经验是什么(假设我有多个可能利用相同数据的视图。这有什么问题?
出于性能和货币的考虑,如果服务器上的映像发生更改怎么办。知道它已更改的最佳策略是什么?我无权修改日期。只有大小,但是,我也不想每次都查询大小。在服务器上的应用程序中设置标志,然后查询标志?
在传统应用程序中(如果有这种事情),不时清除缓存的最佳实践是什么? (缩进了。)
(看到iOS上Facebook的所有性能改进后,我受到启发而写了这篇文章。我没有数十亿要做缓存,但是我至少要对此很聪明!大声笑)
最佳答案
这些答案中的很多取决于您正在编写的应用程序的类型,图像更新的重要性(以及图像发生变化的可能性等)以及生成的图像总数。除了磁盘缓存,您还应该使用内存缓存,尤其是在ListViews和其他区域中,同一图像将反复滚动。查看LruCache并从Google阅读Caching Bitmaps条目。
320x320可能对于列表视图来说太大了,您可能想要创建缩略图(取决于设备以及实现列表视图的方式)。
1)您应该积极使用磁盘缓存(如何定义取决于您编写的应用程序)。使用外部存储目录,如果它们还有几GB的空间,例如,如果您为应用程序占用100 mb的内存,这不是问题。无论如何,都可以清除所有内容。
2)应该没有问题。绝对不要在主线程上处理磁盘IO(即使是闪存介质)。使用AsyncTasks加载图像。无论如何一次只能有一个主要的前台活动,并且在活动处于休眠状态时,无论如何都不应尝试从磁盘读取。
3)同样,这取决于您实现应用程序的方式。检索文件时,您应该能够获得其他信息(即使Apache可以告诉您的应用最后修改日期)。
3.1)您可以拥有一个sqllite db,该数据库跟踪使用某些图像的频率以及最近读取的图像。如果最近的读取是几天前的,让该图像过期。
编辑:我建议使用Jake Wharton现在提供的一个名为Picasso的库,该库处理网络/本地IO以及内存和磁盘缓存。在此处检查:http://square.github.io/picasso/。只需一行即可完成很多您需要做的事情:Picasso.with(this).load(imageFileURL).into(imageView);