java - Sharedpreferences 保存 arraylist<integer> 在发布版本中具有双值

标签 java android arraylist sharedpreferences release

所以我遇到了一个问题,而且我似乎找不到原因,所以我在这里寻求帮助。 我能够找到问题的根源,但我找不到它发生的原因,这就是我所拥有的。

这是我试图保存在共享首选项中的示例。

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/

相关文章:

Android 标签与横向

java - Dagger 2 Android - 将()依赖项注入(inject) ViewModel 与具有依赖项引用的应用程序

java - 使用多个数组列表或带有 stringtokenizer 的数组在 java 中编写解释器

java - 为什么我的 ArrayList 在添加到 Android 中的另一个 ArrayList 时会复制我的项目?

java - 尝试添加数组列表

java - 如何按另一个 id 列表对 java 中的列表进行排序

java - 如何提供一个优雅的时区选择器?

android - Eclipse - keystore 被篡改,或密码不正确。但是昨天成功了

java - 关闭窗口而不关闭应用程序

java - 涉及复杂对象的构建器模式