0

我在创建一个看似简单的应用程序时遇到了一个奇怪的问题(这种想法总是在自找麻烦)。

基本上,应用程序以 开头MainActivity,用户使用它来“登录”应用程序。如果成功,则使用MainActivity进入下一个活动。这一切都很好,一旦开始,它会使用来自.ItemzListstartActivityItemzListListViewSharedPreferences

这再次运作良好。但是,如果您随后按下“主页”按钮并重新启动应用程序,那么当ItemzList从列表中加载的列表SharedPreferences突然为空时(我已经通过调试器和我的设备确认了这一点)。

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

我是否错误地访问了共享首选项?

SharedPreferences settings = getSharedPreferences("MAIN", MODE_PRIVATE);
Set<String> tempSet = settings.getStringSet("LIST", new HashSet<String>());
4

2 回答 2

0

发现错误。我处理了 Set tempSet,然后清除了 tempSet(不记得我背后的推理)。

    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

我想清除 'tempSet' 一些如何清除 sharedPreferences 对象中的列表(但不是 XML 文件本身),所以如果应用程序被缓存,下一次调用 'getSharedPreferences' 只是重用缓存版本(它具有清除列表?) 无论如何,删除线可以解决问题。

于 2013-04-29T16:19:59.677 回答
0

最后我找到了一个解决方案,只需将您的偏好代码放入异步任务中,它就会工作,我不知道为什么,但它会工作。


        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;
    }
}
于 2017-02-04T12:11:31.450 回答