Как синхронизировать объект File в Android / Java - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть два Fragments и File, которые содержат JSON представление List<Competitor>.В первом Fragment я создаю Competitor.Затем я отправляю Competitor в фоновый сервис через IntentServiceIntentService, если откройте File, который содержит List<Competitor>, добавьте Competitor, затем повторно сериализуйте / переписайте File.

После отправки Competitor на IntentService я отправляю пользователя следующему Fragment (пока фоновая служба записывает файл).Проблема в том, что следующий экран ищет тот же File и пытается открыть его и проанализировать в List<Competitor> для использования в RecyclerView.Однако, если фоновая служба все еще записывает File, я получу concurrentModificationException.Этого не произошло, потому что запись File быстрая, но я хочу предотвратить такую ​​возможность.

Я думал, что смогу synchronize на File двумя разными способами (писать и читать).Я не знаю, правильно ли это использовать synchronize.Вот что я думаю:

Метод записи

 public static void writeMasterCompetitorsFile(Context context, List<Competitor> competitors) {

        File file = new File(context.getFilesDir(), MASTER_COMP_FILE);

        synchronized (file) {
            String jsonString = new Gson().toJson(competitors);

            try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
                writer.write(jsonString);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

Метод чтения

public static ListgetMasterCompetitorsList (Context context) {

List<Competitor> list = new ArrayList<>();
File file = new File(context.getFilesDir(), MASTER_COMP_FILE);

synchronized (file) {
    if (file.exists()) {
        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            String compList = reader.readLine();
            Type competitorListType = new TypeToken<List<Competitor>>() {
            }.getType();
            list = new Gson().fromJson(compList, competitorListType);
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        writeMasterCompetitorsFile(context, list);
    }
}

Android Studio говорит мне, что я не должен synchronize для локальной переменной.У меня есть правильная идея?

1 Ответ

0 голосов
/ 30 ноября 2018

Вот пример использования статического объекта для синхронизации.

public static final Object monitor = new Object();

public static void writeMasterCompetitorsFile(Context context, List<Competitor> competitors) {

    File file = new File(context.getFilesDir(), MASTER_COMP_FILE);

    synchronized (monitor) {
        String jsonString = new Gson().toJson(competitors);

        try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
            writer.write(jsonString);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

public static List getMasterCompetitorsList(Context context) {
    List<Competitor> list = new ArrayList<>();
    File file = new File(context.getFilesDir(), MASTER_COMP_FILE);

    synchronized (monitor) {
        if (file.exists()) {
            try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
                String compList = reader.readLine();
                Type competitorListType = new TypeToken<List<Competitor>>() {
                }.getType();
                list = new Gson().fromJson(compList, competitorListType);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            writeMasterCompetitorsFile(context, list);
        }
    }
}
...