Java 从内存中清除应用程序时,保存的SharedReference更改将丢失

Java 从内存中清除应用程序时,保存的SharedReference更改将丢失,java,android,sharedpreferences,Java,Android,Sharedpreferences,我正在更新和保存设置活动中SharedReferences中的值数组。特别是,从ListView的onCLickListener中的AlertDialog。这些更改似乎保存得很好-即,在我关闭并重新打开MainActivity后,这些更改仍然完好无损,但一旦我的应用程序从内存中释放并重新启动,SharedReference就会恢复到以前的状态 我在某个地方读到,在editor.commit()之前调用editor.clear()可以防止这种情况发生,但这也会删除我的SharedReference

我正在更新和保存设置活动中SharedReferences中的值数组。特别是,从ListView的onCLickListener中的AlertDialog。这些更改似乎保存得很好-即,在我关闭并重新打开MainActivity后,这些更改仍然完好无损,但一旦我的应用程序从内存中释放并重新启动,SharedReference就会恢复到以前的状态

我在某个地方读到,在editor.commit()之前调用editor.clear()可以防止这种情况发生,但这也会删除我的SharedReference中的所有其他值(即,我在此代码中未编辑的值)

有人能解释一下为什么我会丢失我的SharedReference更新,以及我如何修复这个问题吗

代码如下:

final ListView lv = (ListView) findViewById(R.id.list_folders);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view,
                            int position, long id) {

        // ListView Clicked item index
        int itemPosition = position;

        // ListView Clicked item value
        final String itemValue = (String) lv.getItemAtPosition(position);

        // Ask the user to confirm deletion of the item using an AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(SourceFolders.this);

        builder.setTitle("Confirm");
        builder.setMessage("Remove " + itemValue + "?");

        builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                // Yes - remove the current item from SharedPreferences
                SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(SourceFolders.this);
                Set<String> set = prefs.getStringSet("source_folders", null);
                if (set == null) {
                    dialog.dismiss(); // List of folders in Preferences is empty - shouldn't happen
                }
                // Remove the selected item from the list
                set.remove(itemValue);
                // Update Shared Preferences
                SharedPreferences.Editor edit = prefs.edit();
                edit.putStringSet("source_folders", set);
                edit.commit();
                folderlist = new ArrayList<String>(set);
                refreshListViewFromPrefs();
                dialog.dismiss();
            }

        });

        builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // Do nothing
                dialog.dismiss();
            }
        });

        AlertDialog alert = builder.create();
        alert.show();
    }
});
final ListView lv=(ListView)findviewbyd(R.id.list\u文件夹);
lv.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
//ListView单击的项目索引
int itemPosition=位置;
//ListView单击的项目值
最终字符串itemValue=(字符串)lv.getItemAtPosition(位置);
//要求用户使用AlertDialog确认删除项目
AlertDialog.Builder=新建AlertDialog.Builder(SourceFolders.this);
建造商名称(“确认”);
setMessage(“删除”+itemValue+“?”);
builder.setPositiveButton(“是”,新建DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
//是-从SharedReferences中删除当前项
SharedReferences prefs=PreferenceManager.GetDefaultSharedReferences(SourceFolders.this);
Set Set=prefs.getStringSet(“源文件夹”,null);
if(set==null){
dialog.dismise();//首选项中的文件夹列表为空-不应该发生
}
//从列表中删除所选项目
set.remove(itemValue);
//更新共享首选项
SharedReferences.Editor edit=prefs.edit();
编辑.putStringSet(“源文件夹”,set);
edit.commit();
folderlist=新阵列列表(集合);
refreshListViewFromPrefs();
dialog.dismise();
}
});
setNegativeButton(“否”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
//无所事事
dialog.dismise();
}
});
AlertDialog alert=builder.create();
alert.show();
}
});

只是一个旁注;如果set==null,则每个注释都不应该发生,您将在if子句后面遇到一个NPE。即dialog.discouse()不会从方法返回。谢谢-注意。我还应该说,此代码位于首选项屏幕中,并且我在同一活动中有其他代码,这些代码还将数据保存(添加)到同一个SharedReferences项目(源文件夹),但它不会遇到相同的问题,即当应用程序从内存中释放时,在其他代码中添加到此首选项的项目不会丢失????错误仍然存在吗?是的,我仍然有错误。目前我不得不实现一个难看的解决方案,它包括将所有SharedReference读入变量,调用.clear(),从变量中重写首选项,然后调用.commit()。如果我这样做,当应用程序从内存中释放时,我就不会再丢失更改。