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()。

我改造了我的代码,现在一切正常。我所做的主要更改是移动使用编辑器删除密钥的代码行,然后在检查是否需要之前提交此更改。

  1. 添加了一个布尔值以确定我是否需要进行任何更改
  2. 仅在提交成功时应用更改

总而言之,代码行更多,但在不必要时对 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);
}