кэширование JSON из веб-сервиса на Android - шаблон? - PullRequest
9 голосов
/ 23 марта 2012

Я хочу кешировать данные из json-webservice в моем приложении для Android. При первом запуске приложения оно должно дождаться загрузки всех данных из сервиса. После этой начальной загрузки приложение должно время от времени проверять (несколько дней) наличие новых данных. Если да, локально сохраненные данные должны быть обновлены и загружены при следующем запуске приложения.

В настоящее время я пытаюсь решить эту проблему с помощью IntentService и сохраняю загруженные данные в файл - но я не очень хороший способ!

Кто-нибудь знает чистый способ сделать это? Шаблон кеширования?

1 Ответ

8 голосов
/ 23 марта 2012

Вот простой способ сделать это, не задействуя службу, потоки, аварийные сигналы и т. Д., Просто определив оболочку вокруг вашего 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 ... но вы все равно должны это делать, потому что он файл или извлеченный из сети, вам следует избегать ввода-вывода в потоке пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...