java - 从 Android 上的 Web 服务缓存 JSON - 模式?

标签 java android json web-services caching

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

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

有没有人知道一个干净的方法来做到这一点?缓存模式?

最佳答案

这是一种不涉及服务、线程、警报等的简单方法。只需在 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 的调用会花费更长的时间,因此您必须在线程中运行它,以免对 UI 产生 ANR ......但无论如何您都应该这样做,因为无论一个文件或从网络中获取,你应该避免在 UI 线程中进行 IO。

关于java - 从 Android 上的 Web 服务缓存 JSON - 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9832569/

相关文章:

java - 如何修复 "Error inflating class android.support.design.widget.NavigationView"

java - Robolectric 3 找不到资源错误

json - 不能使用 jsonb_agg 函数嵌套 PostgreSQL 聚合函数调用

javascript - 在此 NVD3 多条形图中更改数据集时如何缩放 Y 轴?

JavaFX 动画在第一个周期后停止

java - 在 Java 中,为什么 Arrays.copyOf 源代码有时会使用反射?

android - 适用于 Android 的 Facebook SSO Facebook 应用程序

java - 外部硬件指纹扫描仪和安卓设备集成

java - 如何使代码更高效/更干净 - USACO 培训的首要任务

json - Flutter 创建 API 请求并接收字符串 - 'Ä' 'Ö' 'Ü' 'ß'