Это пример моего приложения.singleton shared preferences issue
Я создал одноэлементные общие предпочтения, которые использовали пользовательский Общий класс менеджера предпочтения редактировать общие значения данных предпочтения:
public class MySharedPrefManager {
private static MySharedPrefManager instance= null;
private static SharedPreferences SharedPref;
private static Editor SPEditor;
private MySharedPrefManager() {
}
public static MySharedPrefManager getInstance(){
if(instance==null)
instance= new MySharedPrefManager();
return instance;
}
public void setSharedPreferences(Context context){
SharedPref= context.getSharedPreferences("MySharedPref", Context.MODE_PRIVATE);
SPEditor= SPEditor.edit();
}
public void setAdmin(boolean pAdmin) {
SharedPrefManager.editBoolean("isAdmin", pAdmin, SPEditor);
}
public boolean isAdmin() {
return SharedPref.getBoolean("isAdmin", false);
}
}
Общий менеджер предпочтения:
public class SharedPrefManager {
public static void editString(String key, String value, Editor pEditor){
pEditor.putString(key, value);
pEditor.commit();
}
public static void editBoolean(String key, boolean value, Editor pEditor){
pEditor.putBoolean(key, value);
pEditor.commit();
}
У меня есть много мероприятий который идет как действия: A-> B-> C-> D-> E-> F-> G
Активность А, которая является начальным действием, я получаю экземпляр MySharedPrefManager и d установить SharedPreferences также:
public class ActivityA extends Activity{
private MySharedPrefManager myPref;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.initialization);
myPref= MySharedPrefManager.getInstance();
// I am setting the SharedPreference Context with getApplicationContext(),
// as it is singleton, and I am using it through out my application
myPref.setSharedPreferences(getApplicationContext());
// other stuff...
}
private void changeData(){
myPref.setAdmin(true);
}
private void check(){
if(myPref.isAdmin()){
// do- something
}
}
}
ActivityD:
public class ActivityD extends Activity{
private MySharedPrefManager myPref;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.initialization);
// Here i called only the instance not the setSharedPreferences.
myPref= MySharedPrefManager.getInstance();
// other stuff...
}
private void changeData(){
myPref.setAdmin(true);
}
private void check(){
if(myPref.isAdmin()){
// do- something
}
}
}
Теперь вопрос я столкнулся сейчас является то, что несколько раз я получаю исключения нулевого указателя в myPref.isAdmin() когда Я называю это как в действии А, так и в D. Но большую часть времени он работает.
Также необходимо установить SharedPreferences (вызов метода setSharedPreferences()) в каждом из действий? Я не чувствую, что нужно установить, так как это одноэлементный класс.
Повторяю, я устанавливаю контекст SharedPreference с getApplicationContext(), поскольку он является одиночным, и я использую его через свое приложение.
Отредактировано: Есть 3-4 общих предпочтения, которые я использую с той же структурой .. С аналогичной проблемой. Использование этого PreferenceManager.getDefaultSharedPreferences (контекст);, я смогу использовать только ОДИН SharedPreference, который является SharedPreference по умолчанию.
попробуйте 'PreferenceManager.getDefaultSharedPreferences (контекст);' – Pr38y