如何在android中缓存和存储对象并设置过期策略?

时间:2010-05-03 02:02:40

标签: android performance caching storage

我有一个应用程序从互联网上获取数据,为了获得更好的性能和带宽,我需要实现缓存层。

有两种不同的数据来自互联网,一种是每一小时更换另一种基本不变。因此,对于第一类数据,我需要实现一个过期策略,使其在创建1小时后自行删除,当用户请求该数据时,我将首先检查存储,然后在没有找到的情况下转到互联网。 / p>

我考虑过使用SharedPrefrence或SQLDatabase存储json数据或序列化对象字符串。

我的问题是:

1)我应该使用什么,SharedPrefrence或SQLDatabase或其他任何东西,一块数据并不大,但可能有很多数据实例。

2)如何实现该过期系统。

2 个答案:

答案 0 :(得分:2)

我使用SQLite进行存储+ last invalidated timestamp子类中有Application
它将在每次数据访问调用时与System.currentTimeMillis()进行比较,以确定是否应该获取新的集合。为此设置一个瘦代理层。

答案 1 :(得分:0)

您可以使用HTTP HEAD方法检查服务器上的修改日期,看看是否确实需要获取新数据。每次应用程序启动时,并在其运行时间隔,查询服务器以查看数据是否已更改。这假设数据缓存在服务器上,而不是在每次请求时动态生成,也不依赖于哪个客户端发出请求。

因此,您需要存储每个项目的数据和日期。如果数据是一个中等长度的字符串并且总数少于几千字节,则SharedPreferences应该足够了。如果数据长度存在已知上限,则使用数据库,否则可以使用纯文件。每次提交时,SharedPreferences都会写一个xml文件。

您可以创建具有较长休眠间隔的线程来执行定期检查,或创建处理程序并使用postDelayed或类似方法生成检查线程。对于陈旧数据,请经常检查项目的最大值。如果每10分钟检查一次,则允许最多10分钟的旧数据,平均为一半。在发布时检查会在大多数情况下使事情看起来更新。

如果所有项目一次过期,那么您只需要检查一个项目的日期,以便知道它们都应该刷新。如果没有,您可以尝试使用条件GET而不是检查每个项目的HEAD。