单独 class 中的 SharedPreference?

SharedPreference in a separate class?

我正在尝试创建一个 class,它将包含用于将对象的 ArrayList 保存和加载到 SharedPreferences 的方法。但是,当我尝试加载之前保存的数据时。就好像没有保存一样。我正在使用 Google 的 Gson 库来提供帮助。

Instance_Read_Write.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<>();
        }
    }

}

这就是我引用它们的方式。

MainActivity.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);

有没有办法让它工作?或者更好的方法?

代替类型的标记,输入

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

告诉我它是否有效

这解决了您发布的代码中的一个错误,即方法 loadData 方法中 Examples 参数的处理。

因为您 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);

不要引发 pass-by-value 与 pass-by-reference 的讨论 - 看来您希望 Example 实际参数通过在方法主体中分配它来更新 - 它不会 - 您只能对对象进行操作以影响它:.

为了完成这个主题,这里有一个解决方案可以继续您传递 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);
    }
}