如何同步 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);
}
}
}
我有两个 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);
}
}
}