SharedPreferences String设置数据在应用程序终止后丢失(android模拟器)

时间:2015-12-27 04:18:35

标签: java android android-studio sharedpreferences

我在模拟器上运行它:5554:Nexus_5_API_22_x86。

我正在尝试学习SharedPreferences并编写了一个简单的测试程序。

它包含两个按钮:一个将一个String + random#添加到一个将存储在SharedPreferences中的集合,另一个打印该集合的内容。

每当我按下屏幕右下方的方形按钮并按下' x'关闭应用程序窗口,然后重新启动应用程序,重置该集的内容 - 换句话说,打印该集合不会产生任何结果。

但是,如果我仅使用后退按钮退出应用程序,则内容仍然存在 - 换句话说,打印该集合会产生之前的内容。

爪哇:

...

public class MainActivity extends AppCompatActivity
{
    final int PREF_MODE_PRIVATE = 0;
    TextView output;
    Set<String> testSet;
    Random randomGenerator = new Random();
    SharedPreferences data;
    SharedPreferences.Editor dataEditor;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        output = (TextView) findViewById(R.id.textView); //getting the output textfield
        data = getPreferences(PREF_MODE_PRIVATE);

        //If first-time setup has not been completed, execute the following block
        //I don't want the String Set to be reset to empty every time the app is launched
        if(data.getBoolean("initialized", false) == false)
        {
            //Adding the empty set to storage
            testSet = new HashSet<String>();

            dataEditor = data.edit();
            dataEditor.putStringSet("testSet", testSet); //Add the empty Set to storage
            dataEditor.putBoolean("initialized", true); //Set initialized flag to true
            dataEditor.apply();
        }
    }

    public void printTestSet(View view)
    {
        output.setText(""); //Clears the text field
        Set<String> toBePrinted = data.getStringSet("testSet", null); //Gets the String Set

        //Prints content of the String Set
        if(toBePrinted != null)
        {
            for(String word : toBePrinted)
            {
                output.append(word + '\n');
            }
        }
    }

    public void addToTestSet(View view)
    {
        //Generate a string followed by a random number and add it to the String Set
        int randomInt = randomGenerator.nextInt(1000);
        data.getStringSet("testSet", null).add("NEW STRING #" + randomInt);
    }
}

打印字符串集的按钮调用printTestSet,并将添加字符串的按钮调用到调用addToTestSet

创建后,应用程序使用一个简单的布尔值来检查它是否已首次初始化。如果没有,它会向存储器添加一个空字符串集,并将布尔值设置为true。如果布尔值已经为真(意味着它已经添加了空字符串集),则跳过该步骤。

2 个答案:

答案 0 :(得分:0)

您似乎没有在addToTestSet中保存共享首选项。 当您执行getStringSet然后添加时,您需要再次将字符串Set重新保存为共享首选项,就像使用onCreate()dataEditor.apply()中一样。

或者如果您想提高效率,可以将stringSet保存在活动的onPause()方法中,以防止不断写入SharedPrefs

当你回击时,你的应用程序进程并没有被杀死,这意味着当你再次打开它时,Android系统正在恢复它所能做的事情(textViews中所写的内容,{{1}被检查过的等等简单的东西)。您在框中看到的内容实际上可能不会被checkboxes填充。

答案 1 :(得分:0)

您需要实时提交数据(您正在申请的地方)或暂停应用程序生命周期处理程序(当您的应用程序转到后台时)。当您有少量数据时使用选项1,或者当您需要提交大量数据时使用2。