У меня есть два Fragments
и File
, которые содержат JSON
представление List<Competitor>
.В первом Fragment
я создаю Competitor
.Затем я отправляю Competitor
в фоновый сервис через IntentService
.В IntentService
, если откройте 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
для локальной переменной.У меня есть правильная идея?