【问题标题】:caching JSON from webservice on android - pattern?从 android 上的 web 服务缓存 JSON - 模式?
【发布时间】:2012-04-07 14:55:10
【问题描述】:

我想在我的 android 应用程序中缓存来自 json-webservice 的数据。第一次启动应用程序时,它应该等到从服务加载所有数据。在初始加载后,应用程序应不时(几天)检查是否有新数据可用。如果是,则下次启动应用时应刷新并加载本地存储的数据。

目前我正在尝试通过 IntentService 并将加载的数据保存在文件中来解决这个问题 - 但我不是一个非常干净漂亮的方法!

有人知道这样做的干净方法吗?缓存模式?

【问题讨论】:

  • 添加一个 ContentProvider 将数据存储在数据库中。这可能更漂亮 - 当您可以简单地保存文件时(这本身已经是一种缓存模式),这只是很多工作

标签: java android json web-services caching


【解决方案1】:

这是一种不涉及服务、线程、警报等的简单方法。只需在 JSON 周围定义一个包装器,例如,

class MyJson {
    JSONObject getJson() { ... };
}

getJson() 的实现如下,

if (cached json file exists) {
  if (json file last modified + 1 day > current time) {
    json = get from network;
    cache json in file;
  } else [
    json = get from file;
  }
} else {
    json = get from network;
    cache json in file;
}

换句话说,当你需要它时,从网络中延迟获取新的 json。这比通过设置警报和运行服务来更新缓存来定期更新缓存文件要简单得多......

在您的应用中,无论是第一次加载还是第 N 次加载数据,您都执行相同的操作。你打电话给getJson()

new Thread(new Runnable() {
  public void run() {
    json = getJson();
    // do whatever you need to do after the json is loaded
  }
}).start();

唯一的缺点是,有时,获取 JSON 的调用会花费更长的时间,因此您必须在线程中运行它以免 ANR 用户界面...但无论如何您都应该这样做,因为无论它是否在一个文件或从网络中获取,你应该避免在 UI 线程中做 IO。

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多