Как проверять, когда был изменен файл, перед его загрузкой с сервера?

246
10 сентября 2018, 13:00

Загружаю в стартовой активности файл с сервера. (~400КБ) Файл формата .json , в котором находятся элементы массива. Элементы в дальнейшем попадают в адаптер списка..

Возник вопрос о целесообразности загрузки этого файла каждый раз при открытии приложения.

Хотел реализовать следующее: Пользователь загружает данные (этот самый файл .json) с сервера. Если он полностью закрывает приложение, то при следующем его открытии - проверять, когда он последний раз изменялся. Если изменений не было, то воспользоваться другим способом, а именно - тем самым старым файлом, который предварительно будет сохраняться в папке с приложением на устройстве. Как сохранять загруженные данные обратно в файл на устройство - это уже другой вопрос..

Собственно сам код:

public class ArrayListMain {
private static List<Station> stations = null;
private static Map<String, Station> stationIndex = new HashMap<>();
public static void loadStations(Context context) {
    Splash2Activity.progressBar_load.setVisibility(View.VISIBLE);
    loading_station.setText("Загрузка станций..");
}

public static class AsyncHttpTaskStation extends AsyncTask<String, Void, Boolean> {
    @Override
    public Boolean doInBackground(String... params) {
        boolean results = false;
        try {
            final Gson gson = new Gson();
            Type listType = new TypeToken<ArrayList<Station>>(){}.getType();
            List<Station> chunk = null;
            try {
                stations = new ArrayList<>();
                String baseUrl = "http://my-site.ru/index.json";
                chunk = gson.fromJson(new InputStreamReader(new URL(baseUrl).openStream(), "UTF-8"), listType);
                stations.addAll(chunk);
                Station.sort(stations);
                indexStations(stations);
                results = true;
            } catch (IOException i) {
                i.printStackTrace();
                Log.e(TAG, "Error loading station: %s", i);
                results = false;
            }
        } catch (Error error){
            error.printStackTrace();
            results = false;
        } catch (Exception exp){
            exp.printStackTrace();
            results = false;
        }
        return results;
    }
    @Override
    public void onPostExecute(Boolean results) {
       Splash2Activity.progressBar_load.setVisibility(View.INVISIBLE);
        if (results){
            Splash2Activity.progressBar_load.setVisibility(View.INVISIBLE);
            loading_station.setText("Запуск приложения");
            Splash2Activity.thread.run();
        }
        if(!results){
            loading_station.setText("");
            progressDialog2.show();
            Splash2Activity.progressBar_load.setVisibility(View.INVISIBLE);
        }
    }
}
private static void indexStations(final List<Station> stations) {
    stationIndex.clear();
    for (Station station : stations) {
        stationIndex.put(station.getStationUrl(), station);
    }
}
public static List<Station> getStations() {
    return stations;
}
public static Station getStation(final String url) {
    return stationIndex.get(url);
}
Answer 1

Я бы не советовала делать сравнение по времени, это дополнительная головная боль, в будущем если захотите поменять логику обновления, то потяните эту боль с собой для всех. Это же Json. Структурная форма передачи данных, вы можете сделать расчет хеш суммы файла любым удобным способом, сохранить в Preferences c нужным ключом, после получения в след раз сравнивать. Если у вас проблема с ограниченным объемом данных, то здесь уже оптимизация мб разной. Можно считать заголовок файла, использовать JSONP, настроить на сервере Json с параметрами, где будете опрашивать вначале изменился ли файл такой-то, если придет положительный ответ обновлять нужный файл.

READ ALSO
JavaFX event на перенос файла в программу

JavaFX event на перенос файла в программу

Есть готовая кнопка, по которой открывается файловая система и выбирается файлСейчас хочу сделать чтобы можно было перенести с проводника...

271
java extends abstract class

java extends abstract class

Как создать абстрактный класс с полем которое должно быть обязательно нициализировано?

254
Не работает поиск в MySQL

Не работает поиск в MySQL

Отправляю запрос на поиск в MySQL в следующем коде:

253