重新启动应用程序时不会加载 ArrayList

Posted

技术标签:

【中文标题】重新启动应用程序时不会加载 ArrayList【英文标题】:ArrayList won't load when app is restarted 【发布时间】:2016-06-10 11:19:46 【问题描述】:

我对 android 很陌生,我在保存和加载数据时遇到了问题。

我正在尝试制作一个带有保存和加载按钮的应用程序,这些按钮应该保存 2 个具有 x 和 y 坐标的 ArrayList。

我已尝试使用 SharedPreferences 进行此操作,并且在应用重新启动或屏幕旋转之前一直有效。

当我查看应用程序文件时,ArrayLists 文件位于 SharedPreferences 文件夹中,但如果我按下加载按钮,我的应用程序将不会加载这些文件。

任何人都可以帮助我们为什么在重新启动应用程序时这不起作用?

这是我的加载和保存代码:

    public void saveArrayList(ArrayList aList, String s) 
    SharedPreferences sharedPrefs = getSharedPreferences(prefs, MODE_PRIVATE);
    editor = sharedPrefs.edit();

    Gson gson = new Gson();
    String json = gson.toJson(aList);

    editor.putString(s, json);
    editor.commit();


public void loadFloatList(ArrayList aList, String s) 
    SharedPreferences sharedPrefs = getSharedPreferences(prefs, MODE_PRIVATE);
    Gson gson = new Gson();
    String json = sharedPrefs.getString(s, null);
    Type type = new TypeToken<ArrayList<Float>>() 
    .getType();
    aList = gson.fromJson(json, type);

【问题讨论】:

【参考方案1】:

可能的错误;您正在重新初始化 gson 和 sharedPrefs ,然后它们会采用相同的键值进入新状态。您应该在 onCreate 中执行此操作。

 @Override
protected void onCreate(@Nullable Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    sharedPrefs = getSharedPreferences(PREFS, MODE_PRIVATE);
    json = sharedPrefs.getString(JSON_KEY, "");
    gson = new Gson();

最好使用 apply(),因为这会将 sharedprefs 的值保存为实例,但 commit() 在应用关闭时执行此操作。

public void saveArrayList(ArrayList aList) 

    String json = gson.toJson(aList);

    editor = sharedPrefs.edit();
    editor.putString(JSON_KEY, json);
    editor.apply();


public void loadFloatList(ArrayList aList, String s) 

    json = sharedPrefs.getString(JSON_KEY, "");
    Type type = new TypeToken<ArrayList<Float>>() 
    .getType();
    aList = gson.fromJson(json, type);

还要注意 PREFS 和 JSON_KEY 是最终键值

private final String PREFS = "prefs";
private final String JSON_KEY = "json";
private SharedPreferences sharedPrefs;
private SharedPreferences.Editor editor;
private String json;
private Gson gson;

【讨论】:

以上是关于重新启动应用程序时不会加载 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

重新启动应用程序时获取 ArrayList?

GreenDAO 不会在应用程序重新启动时保留数据

带有 fetchedResultsController 的 Tableview 在应用重新启动或视图重新加载之前不会更新新内容

表数据不会动态重新加载

休眠:必须重新启动 Java 应用程序才能重新加载数据

iOS 为啥我的应用程序在重新启动之前不会将数据加载到 tableview 中?