Android Studio - 共享首选项和写入速度
Android Studio - Shared Preferences and write speed
我想知道是否存在共享首选项无法正常工作的速度。我 运行 下面的代码有一些奇怪的问题。
1st run, 5 of 5 items show up in Set<>
2nd run, 4 of 5 items show up in Set<>
3rd run, 3 of 5 items show up in Set<>
public void addRemoteFacility(String newFacility){
Set<String> facilityList = getRemoteFacilityList();
editor.remove(REMOTE_FACILITY_LIST);
editor.commit();
if(facilityList.size() == 0){
facilityList.add(newFacility);
editor.putStringSet(REMOTE_FACILITY_LIST, facilityList);
}
else{
if(!facilityList.contains(newFacility)){
facilityList.add(newFacility);
editor.putStringSet(REMOTE_FACILITY_LIST, facilityList);
}
}
editor.commit();
}
public Set<String> getRemoteFacilityList(){
return sharedPref.getStringSet(REMOTE_FACILITY_LIST, defaultSet);
}
在我的主要 activity 我正在尝试以下
mPref = new PreferenceUtils(this);
mPref.addRemoteFacility("fFacility 0");
mPref.addRemoteFacility("aFacility 1");
mPref.addRemoteFacility("cFacility 2");
mPref.addRemoteFacility("eFacility 3");
mPref.addRemoteFacility("eFacility 4");
但是,在 main 之后,当我每次 运行 我的 main activity 时调用 getRemoteFacilitiesList() 时,每次我检查 运行 之后都会少显示一个元素。我开始获取所有 5 个元素,所以每次代码为 运行 时它都会一个一个地删除,这很奇怪。我不希望元素添加得这么快,但我想知道为什么以这种奇怪的方式删除它们。
感谢您对诊断的帮助。
编辑** 我猜这可能与异步的 commit() 和 apply() 有关。另外,对于我的情况,我应该使用 apply() 而不是 commit()。
我改造了我的代码,现在一切正常。我所做的主要更改是移动使用编辑器删除密钥的代码行,然后在检查是否需要之前提交此更改。
- 添加了一个布尔值以确定我是否需要进行任何更改
- 仅在提交成功时应用更改
总而言之,代码行更多,但在不必要时对 commit() 的调用更少。使用 apply for final call 因为我不需要成功或失败的结果。我现在唯一的问题是,如果我成功地承诺删除我的列表,并且应用无法正常工作,那可能会很糟糕......这会让我得到一个空列表。
下面是我的新代码:
public void addRemoteFacility(String newFacility){
boolean listUpdateRequired = false;
Set<String> facilityList = getRemoteFacilityList();
if(facilityList.size() == 0){
facilityList.add(newFacility);
listUpdateRequired = true;
}
else{
if(!facilityList.contains(newFacility)){
facilityList.add(newFacility);
listUpdateRequired = true;
}
}
// Item needs to be added to list
if(listUpdateRequired){
// Remove Current List
editor.remove(REMOTE_FACILITY_LIST);
boolean removalResult = editor.commit();
if(removalResult){
editor.putStringSet(REMOTE_FACILITY_LIST, facilityList);
editor.apply();
}
else{
Log.e("preferences", "failed to remove list, not applying changes");
}
}
}
public Set<String> getRemoteFacilityList(){
return sharedPref.getStringSet(REMOTE_FACILITY_LIST, defaultSet);
}
我想知道是否存在共享首选项无法正常工作的速度。我 运行 下面的代码有一些奇怪的问题。
1st run, 5 of 5 items show up in Set<>
2nd run, 4 of 5 items show up in Set<>
3rd run, 3 of 5 items show up in Set<>
public void addRemoteFacility(String newFacility){
Set<String> facilityList = getRemoteFacilityList();
editor.remove(REMOTE_FACILITY_LIST);
editor.commit();
if(facilityList.size() == 0){
facilityList.add(newFacility);
editor.putStringSet(REMOTE_FACILITY_LIST, facilityList);
}
else{
if(!facilityList.contains(newFacility)){
facilityList.add(newFacility);
editor.putStringSet(REMOTE_FACILITY_LIST, facilityList);
}
}
editor.commit();
}
public Set<String> getRemoteFacilityList(){
return sharedPref.getStringSet(REMOTE_FACILITY_LIST, defaultSet);
}
在我的主要 activity 我正在尝试以下
mPref = new PreferenceUtils(this);
mPref.addRemoteFacility("fFacility 0");
mPref.addRemoteFacility("aFacility 1");
mPref.addRemoteFacility("cFacility 2");
mPref.addRemoteFacility("eFacility 3");
mPref.addRemoteFacility("eFacility 4");
但是,在 main 之后,当我每次 运行 我的 main activity 时调用 getRemoteFacilitiesList() 时,每次我检查 运行 之后都会少显示一个元素。我开始获取所有 5 个元素,所以每次代码为 运行 时它都会一个一个地删除,这很奇怪。我不希望元素添加得这么快,但我想知道为什么以这种奇怪的方式删除它们。
感谢您对诊断的帮助。
编辑** 我猜这可能与异步的 commit() 和 apply() 有关。另外,对于我的情况,我应该使用 apply() 而不是 commit()。
我改造了我的代码,现在一切正常。我所做的主要更改是移动使用编辑器删除密钥的代码行,然后在检查是否需要之前提交此更改。
- 添加了一个布尔值以确定我是否需要进行任何更改
- 仅在提交成功时应用更改
总而言之,代码行更多,但在不必要时对 commit() 的调用更少。使用 apply for final call 因为我不需要成功或失败的结果。我现在唯一的问题是,如果我成功地承诺删除我的列表,并且应用无法正常工作,那可能会很糟糕......这会让我得到一个空列表。
下面是我的新代码:
public void addRemoteFacility(String newFacility){
boolean listUpdateRequired = false;
Set<String> facilityList = getRemoteFacilityList();
if(facilityList.size() == 0){
facilityList.add(newFacility);
listUpdateRequired = true;
}
else{
if(!facilityList.contains(newFacility)){
facilityList.add(newFacility);
listUpdateRequired = true;
}
}
// Item needs to be added to list
if(listUpdateRequired){
// Remove Current List
editor.remove(REMOTE_FACILITY_LIST);
boolean removalResult = editor.commit();
if(removalResult){
editor.putStringSet(REMOTE_FACILITY_LIST, facilityList);
editor.apply();
}
else{
Log.e("preferences", "failed to remove list, not applying changes");
}
}
}
public Set<String> getRemoteFacilityList(){
return sharedPref.getStringSet(REMOTE_FACILITY_LIST, defaultSet);
}