Caching Android应用程序共享首选项在重新启动后为空

Caching Android应用程序共享首选项在重新启动后为空,caching,sharedpreferences,Caching,Sharedpreferences,我有一个奇怪的问题,似乎是一个简单的应用程序创建(一个想法,总是自找麻烦) 基本上,应用程序以用户用来“登录”应用程序的main活动开始。如果成功main活动使用startActivity转到下一个活动ItemzList。这一切都很好,一旦ItemzList启动,它就会用SharedReferences中的字符串列表填充其ListView 同样,这很有效。但是,如果您随后按下“主页”按钮并重新启动应用程序,当ItemzList从SharedReferences加载列表时,列表突然变为空(我已通过

我有一个奇怪的问题,似乎是一个简单的应用程序创建(一个想法,总是自找麻烦)

基本上,应用程序以用户用来“登录”应用程序的
main活动开始。如果成功
main活动
使用
startActivity
转到下一个活动
ItemzList
。这一切都很好,一旦
ItemzList
启动,它就会用
SharedReferences
中的字符串列表填充其
ListView

同样,这很有效。但是,如果您随后按下“主页”按钮并重新启动应用程序,当
ItemzList
SharedReferences
加载列表时,列表突然变为空(我已通过调试器和设备确认)

我知道这与正在缓存的应用程序有关,因为如果我在应用程序上“强制停止”,然后重新启动列表,列表会再次工作

我访问共享首选项是否有误

SharedPreferences settings = getSharedPreferences("MAIN", MODE_PRIVATE);
Set<String> tempSet = settings.getStringSet("LIST", new HashSet<String>());
SharedReferences设置=GetSharedReferences(“主”,模式\私有);
Set tempSet=settings.getStringSet(“LIST”,new HashSet());

找到了错误。我处理了设置的tempSet,然后清除了tempSet(记不起我的推理)

SharedReferences设置=GetSharedReferences(“主”,模式\私有);
Set tempSet=settings.getStringSet(“LIST”,new HashSet());
ArrayList stringsEnc=新的ArrayList(临时设置);
tempSet.clear()//这是错误的路线

我假设清除“tempSet”可以清除SharedReferences对象中的列表(但不是XML文件本身),因此如果应用程序被缓存,下一次调用“GetSharedReferences”只会重用缓存版本(其中有已清除的列表?),无论如何,删除该行可以解决问题。

最后我找到了一个解决方案,只要把prefs代码放在异步任务中,它就会工作,我不知道为什么,但它会工作



私有静态类AsyncSave扩展了AsyncTask{
ArrayList favNamesList;
AsyncSave(ArrayList favNamesList){
this.favNamesList=favNamesList;
}
@凌驾
受保护的布尔doInBackground(Void…params){
HashSet strings=新的HashSet();
strings.addAll(favNamesList);
prefss.edit().putStringSet(“favNames”,strings.apply();
返回null;
}
}

你在哪里加载?如果它在Create中,它可能不会在OnCreate中被第二次调用。它确实被第二次调用,但SharedReferences返回一个空集。我已经在Eclipse中的文件浏览器中确认,SharedReferences创建的MAIN.xml文件确实具有该集的值。
    SharedPreferences settings = getSharedPreferences("MAIN", MODE_PRIVATE);
    Set<String> tempSet = settings.getStringSet("LIST", new HashSet<String>());
    ArrayList<String> stringsEnc = new ArrayList<String>(tempSet);
    tempSet.clear(); //This is the erroneous line
        prefss = getSharedPreferences(ACCOUNT_PREFS_NAME, MODE_MULTI_PROCESS);

                new AsyncSave(favNamesList).execute();
private static class AsyncSave extends AsyncTask<Void, Void, Boolean> {
        ArrayList<String> favNamesList;

        AsyncSave(ArrayList<String> favNamesList) {
        this.favNamesList = favNamesList;

    }

    @Override
    protected Boolean doInBackground(Void... params) {
        HashSet<String> strings = new HashSet<String>();
            strings.addAll(favNamesList);
            prefss.edit().putStringSet("favNames", strings).apply();
            return null;
    }
}