重新启动应用程序时不会加载 ArrayList
ArrayList won't load when app is restarted
我是 android 的新手,我在保存和加载数据时遇到问题。
我正在尝试制作一个带有保存和加载按钮的应用程序,这些按钮应该保存 2 个带有 x 和 y 坐标的 ArrayList。
我已经尝试使用 SharedPreferences 进行此操作,它一直有效,直到应用程序重新启动或屏幕旋转。
当我查看应用程序文件时,ArrayLists 文件位于 SharedPreferences 文件夹中,但如果我按下加载按钮,我的应用程序将不会加载这些文件。
任何人都可以帮助我们为什么在重新启动应用程序时这不起作用?
这是我的加载和保存代码:
public void saveArrayList(ArrayList aList, String s) {
SharedPreferences sharedPrefs = getSharedPreferences(prefs, MODE_PRIVATE);
editor = sharedPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(aList);
editor.putString(s, json);
editor.commit();
}
public void loadFloatList(ArrayList aList, String s) {
SharedPreferences sharedPrefs = getSharedPreferences(prefs, MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPrefs.getString(s, null);
Type type = new TypeToken<ArrayList<Float>>() {
}.getType();
aList = gson.fromJson(json, type);
}
可能的错误;您正在重新初始化 gson 和 sharedPrefs,然后它们会采用具有相同键值的新状态。您应该在 onCreate 中执行此操作。
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sharedPrefs = getSharedPreferences(PREFS, MODE_PRIVATE);
json = sharedPrefs.getString(JSON_KEY, "");
gson = new Gson();
}
最好使用 apply(),因为这会将您的 sharedprefs 的值保存为实例,但 commit() 会在应用关闭时执行此操作。
public void saveArrayList(ArrayList aList) {
String json = gson.toJson(aList);
editor = sharedPrefs.edit();
editor.putString(JSON_KEY, json);
editor.apply();
}
public void loadFloatList(ArrayList aList, String s) {
json = sharedPrefs.getString(JSON_KEY, "");
Type type = new TypeToken<ArrayList<Float>>() {
}.getType();
aList = gson.fromJson(json, type);
}
另请注意 PREFS 和 JSON_KEY 是最终键值
private final String PREFS = "prefs";
private final String JSON_KEY = "json";
private SharedPreferences sharedPrefs;
private SharedPreferences.Editor editor;
private String json;
private Gson gson;
我是 android 的新手,我在保存和加载数据时遇到问题。
我正在尝试制作一个带有保存和加载按钮的应用程序,这些按钮应该保存 2 个带有 x 和 y 坐标的 ArrayList。
我已经尝试使用 SharedPreferences 进行此操作,它一直有效,直到应用程序重新启动或屏幕旋转。
当我查看应用程序文件时,ArrayLists 文件位于 SharedPreferences 文件夹中,但如果我按下加载按钮,我的应用程序将不会加载这些文件。
任何人都可以帮助我们为什么在重新启动应用程序时这不起作用?
这是我的加载和保存代码:
public void saveArrayList(ArrayList aList, String s) {
SharedPreferences sharedPrefs = getSharedPreferences(prefs, MODE_PRIVATE);
editor = sharedPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(aList);
editor.putString(s, json);
editor.commit();
}
public void loadFloatList(ArrayList aList, String s) {
SharedPreferences sharedPrefs = getSharedPreferences(prefs, MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPrefs.getString(s, null);
Type type = new TypeToken<ArrayList<Float>>() {
}.getType();
aList = gson.fromJson(json, type);
}
可能的错误;您正在重新初始化 gson 和 sharedPrefs,然后它们会采用具有相同键值的新状态。您应该在 onCreate 中执行此操作。
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sharedPrefs = getSharedPreferences(PREFS, MODE_PRIVATE);
json = sharedPrefs.getString(JSON_KEY, "");
gson = new Gson();
}
最好使用 apply(),因为这会将您的 sharedprefs 的值保存为实例,但 commit() 会在应用关闭时执行此操作。
public void saveArrayList(ArrayList aList) {
String json = gson.toJson(aList);
editor = sharedPrefs.edit();
editor.putString(JSON_KEY, json);
editor.apply();
}
public void loadFloatList(ArrayList aList, String s) {
json = sharedPrefs.getString(JSON_KEY, "");
Type type = new TypeToken<ArrayList<Float>>() {
}.getType();
aList = gson.fromJson(json, type);
}
另请注意 PREFS 和 JSON_KEY 是最终键值
private final String PREFS = "prefs";
private final String JSON_KEY = "json";
private SharedPreferences sharedPrefs;
private SharedPreferences.Editor editor;
private String json;
private Gson gson;