SharedReference在一个单独的类中?

cld4siwp  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(264)

我正在尝试创建一个类,该类将包含用于保存对象的arraylist并将其加载到SharedReference中的方法。但是,当我尝试加载以前保存的数据时。就好像它没有拯救。我正在使用谷歌的gson库来帮助你。
示例\读\写.java

public class Instance_Read_Write {
    public void saveData(Context context, ArrayList<Example> Examples){
        SharedPreferences sharedPreferences = context.getSharedPreferences("instanceKey",Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        Gson gson = new Gson();
        String json = gson.toJson(Examples);
        editor.putString("list", json);
        editor.apply();
    }

    public void loadData(Context context, ArrayList<Example> Examples) {
        SharedPreferences sharedPreferences = context.getSharedPreferences("instanceKey",Context.MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPreferences.getString("list", null);
        Type type = new TypeToken<ArrayList<Example>>() {}.getType();
        Examples = gson.fromJson(json, type);

        if (Examples == null) {
            Examples = new ArrayList<>();
        }
    }

}

这就是我引用它们的方式。
主活动.java

Instance_Read_Write instance_read_write = new Instance_Read_Write();
instance_read_write.loadData(context,Examples);
Examples.add(new Example("test"));

    ...
    ...
    ...

   instance_read_write.saveData(context,Examples);

有没有办法让这一切顺利?或者更好的方法?

ffdz8vbo

ffdz8vbo1#

这解决了您发布的代码中的一个错误,即 Examples 方法中的参数 loadData 方法。
既然你的意图 loadData 总是生成一个arraylist,然后我建议返回示例。或者,您必须首先创建一个空的arraylist并传入它,然后对其进行操作。
所以使用返回arraylist的方法:

public ArrayList<Example> loadData(Context context) {
    ArrayList<Example> result;
    SharedPreferences sharedPreferences = context.getSharedPreferences("instanceKey",Context.MODE_PRIVATE);
    Gson gson = new Gson();
    String json = sharedPreferences.getString("list", null);
    Type type = new TypeToken<ArrayList<Example>>() {}.getType();
    result = gson.fromJson(json, type);

    if (result == null) {
        result = new ArrayList<>();
    }
    return result;
}

// ... and the calling code (in MainActivity) looks like:
Examples = instance_read_write.loadData(context);

不要让“传递值”和“传递引用”的讨论火上浇油——这似乎是您所期待的 Example 要通过在方法体中指定来更新的实际参数-它不会-您只能对对象进行操作以影响它:https://stackoverflow.com/a/40523/2711811.
为了完成这个主题,这里有一个解决方案,它将继续您传递 Examples 对象:

// In calling method...
Examples = new ArrayList<Example>;
instance_read_write.loadData(context,Examples);

//...in class Instance_Read_Write...

public void loadData(Context context, ArrayList<Example> Examples) {
    SharedPreferences sharedPreferences = context.getSharedPreferences("instanceKey",Context.MODE_PRIVATE);
    Gson gson = new Gson();
    String json = sharedPreferences.getString("list", null);
    Type type = new TypeToken<ArrayList<Example>>() {}.getType();
    ArrayList<Example> t = gson.fromJson(json, type);

    if (t != null) {
        Examples.addAll(t);
    }
}
p4tfgftt

p4tfgftt2#

Examples = gson.fromJson(json, Example.class);

告诉我是否有效

相关问题