我有两个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();
}
}
}
读取方法
公共静态列表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);
}
}
}