如何同步 Android / Java 中的文件对象

How to synchronize on a File object in Android / Java

我有两个 Fragments 和一个 File,其中包含一个 List<Competitor>JSON 表示。在第一个 Fragment 中,我创建了一个 Competitor。然后我通过 IntentService 将此 Competitor 发送到后台服务。在IntentService中如果打开包含List<Competitor>File,添加Competitor,然后重新序列化/重写File

Competitor 发送到 IntentService 后,我将用户发送到下一个 Fragment(同时后台服务正在写入文件)。问题是下一个屏幕会寻找相同的 File 并尝试打开它,并将其解析为 List<Competitor> 以便在 RecyclerView 中使用。但是,如果后台服务仍在写入 File,我将以 concurrentModificationException 结束。这并没有发生,因为 File 写入很快,但我想防止这种可能性。

我想我可以在 File 上用两种不同的方法(写入和读取)synchronize。我不知道这是否是正确的使用方式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 List getMasterCompetitorsList(上下文上下文) {

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 局部变量。我有正确的想法吗?

下面是一个使用静态对象进行同步的例子。

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);
        }
    }
}