Android应用的缓存策略

时间:2011-02-02 11:54:09

标签: android caching

我正在考虑如何在我的Android应用中理想地实施缓存层

目前我有通用的活动,显示来自远程服务器的数据。数据由DTO TemplateInstance 表示。每个 TemplateInstance 都有一个带有组件的Map,每个组件都可以有子组件。组件本身可以是Text(String),Image(ByteArray)或Time(或者通过子类化Component组成的任何东西)。

目前我的应用每次启动一个Activity时都会从服务器加载一个TemplateInstance。

我现在想在应用中实现缓存层,以便

  1. 显示数据的时间减少到最低限度
  2. 数据在服务器上更改后会刷新。
  3. 我的策略如下:

    • 已启动的Activity通过ID(如果存在)
    • 从本地存储加载TemplateInstance
    • 如果服务器上的TemplateInstance已更改(使用数据库中的版本字段),UpdateService会在后台检查
    • 如果服务器版本大于本地版本,或者没有本地TemplateInstance,则从服务器检索数据,更新本地存储并更新视图

    我已经使用 db4o 成功实现了这一点。这个解决方案只有两个问题:

    • db4o属于GPL(我不能使用它)
    • 当我加载具有许多图像的TemplateInstances(查询时间为4秒)时,db4o非常慢。

    现在我正在寻找db4o的最佳替代品。我的想法到现在为止:

    • 由于数据结构
    • ,SQLite不合适
    • 我不需要数据库功能 - 按ID检索对象就足够了
    • 将对象保存在内存中会明显加快
    • 应用程序退出时应将内存状态保存到磁盘,因此可以在启动时重新实例化对象

    您认为最佳解决方案是什么?

    我对此的研究将我带到了 EHCache JCS ,这是我从未使用过的。您认为它们是否合适,也适用于Android手机上的资源?或者您有其他建议吗?

3 个答案:

答案 0 :(得分:4)

如果我理解你的情况,我认为你应该实施自己的缓存解决方案。

我会使用HashMap<id, TemplateInstance>。 HashMap是可序列化的,您可以分别使用ObjectOutputStreamObjectInputStream来存储/加载它。

答案 1 :(得分:2)

db4o不仅限于GPL,通过其dOCL您可以选​​择其他开源许可证,如果您根本不能使用开源,那么它也完全是free for Android apps

答案 2 :(得分:0)

你可以使用我的分叉 simple-disk-cache这是一个易于使用的磁盘缓存,它使用了DiskLruCache

我已经用google guava取代了Apache Commons IO依赖。并添加新的公共方法: put(String key, String value, Object[] array) - 我用来为最大TTL设置时间戳的值(在此时间以ms为单位,缓存已过期) 并且:T getArray(String key, Class type)

您可以从Serializable对象中放入数组,如下所示:

cache.put("key", String.valueOf(new Date().getTime() + 60000), Groups[] arrayGroups);

并获取它:Groups[] cacheArray = getCacheArray("key", Groups[].class);

你也可以放入缓存位图图片。