所以我遇到了一个问题,而且我似乎找不到原因,所以我在这里寻求帮助。 我能够找到问题的根源,但我找不到它发生的原因,这就是我所拥有的。
这是我试图保存在共享首选项中的示例。
public class Registo implements Serializable {
int id;
String name;
ArrayList<Integer> commitedViolations= new ArrayList<>();
}
我做了所有的保存过程
public void addRegisto(Context context, Registo registo) {
ArrayList<Registo> registos = getRegistos(context);
if (registos == null)
registos = new ArrayList<>();
registos.add(registo);
saveRegistos(context, registos);
}
public void saveRegistos(Context context, ArrayList<Registo> favorites) {
// used for store arrayList in json format
SharedPreferences settings;
SharedPreferences.Editor editor;
settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
editor = settings.edit();
Gson gson = new Gson();
String jsonFavorites = gson.toJson(favorites);
editor.putString(REGISTOS, jsonFavorites);
editor.apply();
}
这就是神奇发生的地方,当我检索我保存在设备中的对象时,使用以下值 [200, 201, 202] 保存的对象的 arrayList 现在将它们作为 Double 值 [200.0, 201.0] 返回, 202.0].
我做了一个解决方法,但我想知道为什么会这样。
public ArrayList<Registo> getRegistos(Context context) {
SharedPreferences settings;
List<Registo> registos;
settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
if (settings.contains(REGISTOS)) {
String jsonFavorites = settings.getString(REGISTOS, null);
Gson gson = new Gson();
Registo[] registosItems = gson.fromJson(jsonFavorites, Registo[].class);
// <WORKAROUND>
for (Registo registosItem : registosItems) {
for (int i = 0; i < registosItem.getCommitedViolations().size(); i++) {
String str = String.valueOf(registosItem.getCommitedViolations().get(i));
double valueAsDouble = Double.parseDouble(str);
int valueAsInt= (int) valueAsDouble;
registosItem.getCommitedViolations().set(i, valueAsInt);
}
}
// </WORKAROUND>
registos = Arrays.asList(registosItems);
registos = new ArrayList<>(registos);
} else
return null;
return (ArrayList<Registo>) registos;
}
附言。最奇怪的是调试版本运行完美,这个错误只发生在发布版本上。
最佳答案
这是 gson
的问题,与 SharedPreferences
无关,因为它们不会修改您正在保存的字符串。
错误在于gson
序列化和反序列化Integer
。你可以看到一个关于这个的问题here .
关于java - Sharedpreferences 保存 arraylist<integer> 在发布版本中具有双值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34979410/