如何在Android / Java中的File对象上同步

时间:2018-11-30 17:27:54

标签: java android multithreading concurrentmodification synchronize

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

Competitor发送到File之后,我将用户重定向到下一个Competitor(后台服务正在写入文件)。问题在于下一个屏幕会寻找相同的IntentService并尝试将其打开,然后将其解析为Fragment以便在File中使用。但是,如果后台服务仍在编写List<Competitor>,那么我将以RecyclerView结尾。由于File的写入速度很快,因此尚未发生,但我想避免这种可能性。

我当时想我可以用两种不同的方法(写和读)在concurrentModificationExceptionFile。我不知道这是否是使用synchronize的正确方法。以下是我的想法:

写入方法

File

读取方法

公共静态列表getMasterCompetitorsList(上下文上下文){

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(); } } } 告诉我,我不应该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); } } 使用局部变量。我有正确的主意吗?

1 个答案:

答案 0 :(得分:1)

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

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