Мне нужен класс, который обрабатывает мои SharedPreferences, и я придумал 3 способа сделать это, однако после некоторых исследований кажется, что большинство из них считаются «анти-шаблонами».Самый безопасный способ использования SharedPreferences
Тип 1
public final class MyPrefs {
private MyPrefs(){ throw new AssertionError(); }
public static void setFavoriteColor(Context context, String value){
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.edit().putString("color_key", value).apply();
}
public static void setFavoriteAnimal(Context context, String value){
// ...
}
// ...
}
/* Usage */
MyPrefs.setFavoriteColor(this, "yellow");
// Reason why it might be considered "Bad"
// Class is not OO, just collection of static methods. "Utility Class"
Тип 2
public class MyPrefs {
private SharedPreferences mPreferences;
private static volatile MyPrefs sInstance;
public static MyPrefs getInstance(Context context){
if(sInstance == null){
synchronized(MyPrefs.class){
if(sInstance == null){
sInstance = new MyPrefs(context);
}
}
}
return sInstance;
}
private MyPrefs(Context context){
mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
}
public void setFavoriteColor(String value){
mPreferences.edit().putString("color_key", value).apply();
}
public void setFavoriteAnimal(Context context, String value){
// ...
}
// ...
}
/* Usage */
MyPrefs myPrefs = MyPrefs.getInstance(this);
myPrefs.setFavoriteColor("red");
// Reason why it might be considered "Bad"
// Singleton's are frowned upon especially
// in android because they can cause problems and unexpected bugs.
Тип 3
public class MyPrefs {
SharedPreferences mPreferences;
public MyPrefs(Context context){
mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
}
public void setFavoriteColor(String value){
mPreferences.edit().putString("color_key", value).apply();
}
public void setFavoriteAnimal(Context context, String value){
// ...
}
// ...
}
/* Usage */
MyPrefs myPrefs = new MyPrefs(this);
myPrefs.setFavoriteColor("green");
// Reason why it might be considered "Bad"
// Lots of boilerplate and must create object every
// time you want to save a preference.
Теперь мои предпочтения обертки, очевидно, не состоят только 2 сеттеров, у них есть много добытчиков и сеттеры, которые выполняют некоторую обработку стороны перед сохранением значений, поэтому, сохраняя и обрабатывая предпочтения в течение Основная деятельность может вызвать много грязного кода и ошибок.
Теперь какой из этих подходов не будет иметь негативного влияния на производительность/вызвать непредвиденные ошибки?
это вы проблема решена? –
@SumitYadav да почти все. Кажется, что все они работают и могут быть безопасными в использовании, однако некоторые (например, singleton) могут вызывать проблемы, которые необходимо решать. Я просто останусь в безопасности и использую 1 или 3. – Linxy
Не используйте метод .apply(), используйте метод .commit() в отдельной теме. Причина в том, что .apply() планирует сохранение в фоновом режиме, и вы не можете быть уверены, что данные сохраняются перед другим .apply(). Это может привести к потере данных. Используйте .commit() вместо этого, скажем, в цепочке rxJava –