2010-05-03 125 views
4

我有一个应用程序从互联网获取数据,为了获得更好的性能和带宽,我需要实现一个缓存层。如何缓存和存储对象并在android中设置过期策略?

有两种不同的数据来自互联网,一种是每隔一小时更换一次,另一种基本不会改变。因此,对于第一类数据,我需要实施一项过期策略,以便在创建1小时后将其自行删除,并且当用户请求该数据时,我会首先检查存储空间,然后在没有找到任何内容的情况下转到Internet。

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

我的问题是:

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

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

回答

2

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

0

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

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

您可以创建一个具有长睡眠间隔的线程来执行定期检查,或者创建一个Handler并使用postDelayed或类似的方法产生一个检查线程。根据陈旧数据的最大值检查项目。如果每10分钟检查一次,则允许最多10分钟的旧数据,平均为一半。无论如何,在启动时检查会使事情在大多数情况下显示最新。

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

+0

我尽量避免HTTP调用。 – yanchenko 2010-05-03 03:30:44

+0

一旦你决定要打服务器,你仍然可以通过查看数据是否真的改变来节省一些带宽。 – drawnonward 2010-05-03 18:28:05