为啥我的 SharedPreferences 在应用程序启动后没有立即加载?

Posted

技术标签:

【中文标题】为啥我的 SharedPreferences 在应用程序启动后没有立即加载?【英文标题】:Why aren't my SharedPreferences loading right after application launch?为什么我的 SharedPreferences 在应用程序启动后没有立即加载? 【发布时间】:2020-11-03 03:15:18 【问题描述】:

我使用SharedPreferences 来存储用户输入,这样当应用程序关闭然后重新启动时,用户输入会保留在那里并且不会自动删除。但是,当我在关闭应用程序后重新启动应用程序时,用户输入不会出现在屏幕上,直到用户添加另一个输入。在用户添加另一个输入之后,在关闭应用程序之前在会话中添加的输入现在出现在屏幕上。知道为什么会发生这种情况吗?谢谢!

This 是在需要视觉示例的情况下发生的情况。

这是负责加载用户输入内容的方法,我在 onCreate 方法上调用此方法:

    public void loadSemesters() 
        sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPreferences.getString("SEMESTER_LIST", null);
        Type type = new TypeToken<ArrayList<Semester>>() 
        .getType();
        mySemesters = gson.fromJson(json, type);

        if (mySemesters == null) 
            mySemesters = new ArrayList<>();
        
    

这个方法负责保存用户输入:

   public void saveSemesters() 
        sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        Gson gson = new Gson();
        Type type = new TypeToken<ArrayList<Semester>>() 
        .getType();
        String json = gson.toJson(mySemesters, type);
        editor.putString("SEMESTER_LIST", json);
        editor.apply();
    

【问题讨论】:

再次启动应用后,您是否检查过您的列表是否为空或为空? 我想它不是空的,因为在添加新学期之后,添加的其他学期现在出现在 ListView 上。无论哪种方式,我将如何检查? @takieddine 我想你的列表是学期所以循环列表并在那里记录数据 是的,mySemestersArrayList&lt;Semester&gt; @takieddine 所以为你的arraylist创建一个循环,然后在应用程序启动后立即检查,检查那里是否有数据 【参考方案1】:

作为一种解决方案,我猜您在应用重新启动后忘记将数据设置为您的视图(更新 UI),因此您需要更新您的 UI

public void loadSemesters() 
       sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
       Gson gson = new Gson();
       String json = sharedPreferences.getString("SEMESTER_LIST", null);
       Type type = new TypeToken<ArrayList<Semester>>() 
       .getType();
       mySemesters = gson.fromJson(json, type);

       //Your have your semeters arraylist , now get the data from the list and 
       //set it to 
      // your views

       if (mySemesters == null) 
           mySemesters = new ArrayList<>();
       
   

【讨论】:

我不知道如何将数据添加到视图中 你在使用带有适配器的 recyclerview 吗?当你从你的edittext中添加semeter时,你在哪里显示它们? 我正在使用 ListViewArrayAdapter&lt;Semester&gt; 所以再次调用你的适配器,适配器适配器=新适配器(这里传递你的列表)..然后将适配器设置为你的列表视图

以上是关于为啥我的 SharedPreferences 在应用程序启动后没有立即加载?的主要内容,如果未能解决你的问题,请参考以下文章

产品,添加到购物车,cookie 值未显示在 ListView 中

Android SharedPreferences 数据丢失问题

SharedPreferences 与私有文件

在 Android 中备份 SharedPreferences?

SharedPreferences 在启动时始终为空 - Flutter

保存整数的 sharedPreferences [重复]