2016-03-24 3 views
3

У меня есть немного сомнений относительно SharedPreferences в Android.SharedPreferences - Android

Чтобы удалить предпочтение, в основном мы имеем два варианта:

Первое:

SharedPreferences.Editor edit = (Editor) getSharedPreferences(Constants.APP_DEFAULT_PREF, MODE_PRIVATE).edit(); 
edit.putString(Constants.PREF_ACC, null); 
edit.commit(); 

Второе:

SharedPreferences.Editor edit = (Editor) getSharedPreferences(Constants.APP_DEFAULT_PREF, MODE_PRIVATE).edit(); 
edit.remove(Constants.PREF_ACC); 
edit.commit(); 

В любом случае, выборка Constants.PREF_ACC значение из SharedPreferences вернется null.

Мне было интересно, какой из них я должен предпочесть. Есть ли какие-либо проблемы с памятью в любом из них? Каким будет поведение System.gc?

+0

Вы хотите, чтобы добавить значение в sharedPref? –

+0

Предположим, я установил значение предпочтения, обратился к нему, а затем попытался его удалить, потому что он больше не действителен. При необходимости мы попытаемся получить к нему доступ. – cprakashagr

+0

тогда оба варианта хороши –

ответ

1

Теоретически remove лучше, чем put(null), так как он удаляет как ключ, так и значение (после фиксации) вместо сопоставления (и сохранения) ключа с нулевым значением.

Но судя по Android 5.1.1 implementation, они эквивалентны:

... 
    String k = e.getKey(); 
    Object v = e.getValue(); 
    // "this" is the magic value for a removal mutation. In addition, 
    // setting a value to "null" for a given key is specified to be 
    // equivalent to calling remove on that key. 
    if (v == this || v == null) { 
     if (!mMap.containsKey(k)) { 
      continue; 
     } 
     mMap.remove(k); 
    } else { 
    ... 

Это также то, что один из putXXX методов (putStringSet) документация говорит:

Передача нуль для этого аргумента эквивалентно вызов remove (String) с помощью этого ключа.

0

Я бы рекомендовал использовать remove.

Когда мы putString или remove ничего не будут сделано, он просто отмечен в Editor, как должны быть сделано и будет сделано только тогда, когда commit называется И когда коммят называют все Выкрутить вызовы выполняются перед путы вызовов. Поэтому лучше использовать вызовы remove, чтобы удалить что-то из редактора.

0

Судя по docs интерфейса SharedPreferences.Editor для remove(String):

Марка в редакторе, что значение предпочтения должны быть удалены, что будет сделано в реальных предпочтений раз совершить() называется.

Обратите внимание, что при возврате к предпочтениям все удаления выполняются в первую очередь, независимо от того, вы вызывали ли вы до или после методы ввода в этом редакторе.

... и putInt(int):

установить INT значение в редакторе настроек, чтобы записать обратно после фиксации() или применить() называются.

... кажется, есть только одна поразительная разница: remove(String) звонки будут «делать первые, независимо от того, до или после того, как методы нанесенными называется ли вы удалить».

Тем не менее, я действительно сомневаюсь, что фактический порядок исполнения не имеет большого значения для средних случаев использования, поэтому вы можете просто выбрать один из этих методов и быть полностью в порядке.

p.s., я все еще ищу конкретный класс SharedPreferences.Editor, который может предоставить дополнительные сведения об этом. Будет обновляться, как только я его найду.