安卓应用程序的缓存策略

11

我正在思考如何在我的Android应用程序中理想地实现缓存层

目前,我有通用的活动(Activity),可以显示来自远程服务器的数据。数据由DTO TemplateInstance表示。每个TemplateInstance都有一个包含组件的Map,每个组件都可以有子组件。这些组件本身可以是文本(字符串)、图像(字节数组)或时间(或者通过对Component进行子类化来实现其他类型)。

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

现在,我想在应用程序中实现缓存层,以便于:

  1. 最大程度地减少显示数据的时间
  2. 在服务器上更改数据时刷新数据

我的策略如下:

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

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

  • db4o受GPL许可证保护(我不能使用它)
  • 当我加载具有多个图像的TemplateInstances时,db4o速度非常慢(查询需要4秒)

现在我正在寻找最好的替代方案。我的想法如下:

  • SQLite不适合数据结构
  • 我不需要数据库功能 - 仅通过ID检索对象即可
  • 将对象保存在内存中会显着提高速度
  • 应用程序退出时,应将内存状态保存到磁盘,以便可以在启动时重新实例化对象

你认为什么是这个问题的最佳解决方案?

我的研究带我了解到EHCacheJCS,但我从未使用过它们。您认为它们是否合适,尤其是在 Android 手机上使用资源吗?或者您有其他建议吗?


你可以在这里找到Android应用程序的缓存实现。 - Tanvi Agarwal
3个回答

5

如果我正确理解您的情况,我认为您应该实现自己的缓存解决方案。

我会使用一个 HashMap<id, TemplateInstance>。 HashMap 是可序列化的,您可以使用 ObjectOutputStreamObjectInputStream 进行存储/加载。


谢谢!这是一个非常棒的想法。我最终构建了一个包含多个HashMap和ArrayList的数据结构,并使用ObjectOutputStream保存了这个缓存对象。效果非常好! - Konsumierer
不幸的是,当需要缓存大量数据(如图像)时,该解决方案并不是最佳选择,因为有一个虚拟机限制,即一个应用程序可以使用多少内存。 - Konsumierer
4
应该使用文件来缓存图片,而不是可序列化对象。 - goncalossilva

2

通过其dOCL,db4o并不仅限于GPL,你可以选择其他开源许可证。如果你根本无法开源,那么对于Android应用程序来说,它也是完全免费的。了解更多


0
您可以使用我的分支simple-disk-cache,这是一个易于使用的磁盘缓存工具,底层使用了DiskLruCache
我已经用Google Guava替换了Apache Commons IO依赖,并添加了新的公共方法: put(String key, String value, Object[] array) - 我使用的值是放置最大TTL时间戳的(在此时间后,缓存将过期)。 以及:T getArray(String key,Class type) 您可以像这样将可序列化对象数组放入其中:
cache.put("key", String.valueOf(new Date().getTime() + 60000), Groups[] arrayGroups);

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

你也可以将位图图像放入缓存中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接