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