我有两个Fragments和一个File,其中包含JSONList<Competitor>表示形式。在第一个Fragment中,我创建一个Competitor。然后,我通过Competitor将此IntentService发送到后台服务。在IntentService中,如果打开包含FileList<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();
            }
        }

    }


读取方法

公共静态列表getMasterCompetitorsList(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。我有正确的主意吗?

最佳答案

这是使用静态对象进行同步的示例。

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

09-27 06:57