Sharedpreferences 在发布版本中保存 arraylist<integer> 和双值

Sharedpreferences saving arraylist<integer> with double values in release version

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

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

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,现在 returns 它们作为双精度值 [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;
}

PS。最奇怪的是,调试版本运行完美,这个错误只发生在发布版本上。

        for (Registo registosItem : registosItems) {
            for (int i = 0; i < registosItem.getCommitedViolations().size(); i++) {
                String str = String.valueOf(registosItem.getCommitedViolations().get(i));
                int valueAsInt= Integer.parseInt(str);
                registosItem.getCommitedViolations().set(i, valueAsInt);
            }
        }

这应该可以解决有关双打的问题,为什么不直接解析字符串?

这是 gson 的问题,与 SharedPreferences 无关,因为它们不会修改您正在保存的字符串。

错误在于 gson 序列化和反序列化 Integer。你可以看到一个关于这个的问题 here.