2011-03-09 70 views
1

有没有办法彻底摆脱偏好?看起来clear()和remove(key)并没有完全摆脱偏好。如果你调用clear()然后调用SharedPreferences.contains(“key”),它将返回true。摆脱偏好

请注意,我也犯()clear()。

+0

如果我们能看到你的一些代码会更容易。通过调用清除,然后提交应该工作。这听起来像命令没有被调用。 – Phobos 2011-03-09 08:24:08

+0

正在调用这些命令。问题是VALUE被清除,但我定义的属性/密钥仍然存在。 – locoboy 2011-03-09 17:40:04

回答

1

这里是如何实现的clear()

public Editor clear() { 
    synchronized (this) { 
     mClear = true; 
     return this; 
    } 
} 

public boolean commit() { 
    //...  
    synchronized (this) { 
     if (mClear) { 
     mMap.clear(); 
     mClear = false; 
     } 
    } 
    //... 
} 

这里是如何实现的contains(String key)

public boolean contains(String key) { 
    synchronized (this) { 
    return mMap.containsKey(key); 
    } 
} 

你可以看到自己的代码here。 (请注意,如果清除所有首选项,则不会调用首选项更改侦听器)。

这个实现对我来说看起来很好,很可能它是你的代码的问题。 这是我的简短示例应用程序,它验证clear()是否正常工作。

public class TestPrefClear extends Activity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
     prefs.edit().putBoolean("TEST", true).commit(); 
     if(!prefs.contains("TEST")){ 
      throw new IllegalStateException(); 
     } 
     prefs.edit().clear().commit(); 
     if(prefs.contains("TEST")){ 
      throw new IllegalStateException(); 
     }  
    } 
} 
0

clear()是不明确的,它首先清除偏好,然后用修改的preference. replace()重新初始化可以满足您的需要,只需传递一个空的地图。

+0

是否有替换()的文档?我找不到它 – locoboy 2011-03-09 08:43:56

+0

哦,这是一个内部API。我不知道。 – 2011-03-09 08:57:41

+0

函数'replace()'未放置在SharedPreferences接口中,但此函数存在于SharedPreferences的SharedPreferencesImpl实现中。我建议避免使用它。 – inazaruk 2011-03-09 09:15:34