我在模拟器上运行它: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。如果布尔值已经为真(意味着它已经添加了空字符串集),则跳过该步骤。
答案 0 :(得分:0)
您似乎没有在addToTestSet中保存共享首选项。
当您执行getStringSet
然后添加时,您需要再次将字符串Set重新保存为共享首选项,就像使用onCreate()
在dataEditor.apply()
中一样。
或者如果您想提高效率,可以将stringSet保存在活动的onPause()
方法中,以防止不断写入SharedPrefs
当你回击时,你的应用程序进程并没有被杀死,这意味着当你再次打开它时,Android系统正在恢复它所能做的事情(textViews
中所写的内容,{{1}被检查过的等等简单的东西)。您在框中看到的内容实际上可能不会被checkboxes
填充。
答案 1 :(得分:0)
您需要实时提交数据(您正在申请的地方)或暂停应用程序生命周期处理程序(当您的应用程序转到后台时)。当您有少量数据时使用选项1,或者当您需要提交大量数据时使用2。