我有两个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
的写入速度很快,因此尚未发生,但我想避免这种可能性。
我当时想我可以用两种不同的方法(写和读)在concurrentModificationException
上File
。我不知道这是否是使用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);
}
}
使用局部变量。我有正确的主意吗?
答案 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);
}
}
}