2011-02-02 59 views
10

我正在考虑如何在我的Android应用中理想地实现缓存层适用于Android应用的缓存策略

目前我有通用的活动,它显示来自远程服务器的数据。数据由DTO TemplateInstance表示。每个模板实例都有一个包含的组件,其中每个组件都可以包含子组件。组件本身可以是文本(字符串),图像(ByteArray)或时间(或通过子分类组件)。

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

我现在想实现在应用一个缓存层,使得

  1. 于显示数据的时间减少到最低限度,
  2. 数据被刷新,当它在服务器上更改。

我对这个策略是这样的:

  • 的启动活动由ID加载从本地存储的模板实例(如果存在)
  • 一个UpdateService检查中,如果模板实例背景已在服务器上更改(使用数据库中的版本字段)
  • 如果服务器版本大于本地版本或者没有本地TemplateInstance,则从服务器检索数据,更新本地存储并更新视图

db4o的实现了这个已经成功。只是有两个问题的解决方案:

  • db4o的是GPL下(我不能用它)
  • db4o的实在是太慢了,当我打开其中有许多图像(4秒查询)TemplateInstances

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

  • SQLite是因为
  • 我不需要数据库功能的数据结构,不适合 - 通过ID检索对象将是足够
  • 保持在对象当应用程序退出,所以对象可以在启动时重新实例

你认为什么是最好的解决办法内存是显著快

  • 内存状态应保存到磁盘为了这?

    我对这个问题的研究把我带到的EHCacheJCS,这是我从来没有使用过。你认为他们是适当的,也是在Android手机资源方面?或者你有其他建议吗?

  • +0

    您可以从[here](https://stackoverflow.com/a/45086960/5835760)找到android应用程序的缓存实现。 – 2017-08-18 05:28:55

    回答

    4

    如果我正确理解你的情况,我认为你应该实现你自己的缓存解决方案。我可以使用HashMap<id, TemplateInstance>。 HashMap是可序列化的,您可以分别使用ObjectOutputStreamObjectInputStream来存储/加载它。

    +0

    谢谢!这是一个非常整洁的想法。我最终构建了一个包含多个HashMap和ArrayLists的数据结构,并使用ObjectOutputStream保存这一个缓存对象。奇迹般有效! – Konsumierer 2011-02-03 09:43:56

    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)

    你可以把阵列从这样的序列化对象:

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

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

    你可以把缓存位图图像了。