java单例共享首选项问题
这只是我的应用程序的一个示例
我创建了一个singleton共享首选项,它使用自定义共享首选项管理器类编辑共享首选项数据值:
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
活动A是启动活动,我获取MySharedPrefManager实例并设置SharedReferences:
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
}
}
}
活动D:
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中出现Null指针异常。isAdmin()当我在活动A和D中都调用它时。但大多数时候它都有效
我是否还需要在每个活动中设置SharedReferences(调用setSharedPreferences()方法)我觉得没有必要设置,因为它是单例类
我重复一遍,我正在使用getApplicationContext()设置SharedReference上下文,因为它是单例的,我正在整个应用程序中使用它
已编辑:有3-4个共享首选项,我正在使用相同的结构。。与类似的问题。使用此首选项管理器。GetDefaultSharedReferences(上下文),我将只能使用一个SharedReference,这是默认的SharedReference
# 1 楼答案
空指针异常可能是由于未初始化单例而导致的。我想当你旋转你的设备时会发生这种情况
我预计会发生以下事情:在活动A中,你做
getInstance()
和setSharedPreferences()
。在活动B中,您只需执行getInstance()
操作,并期望获得在A中创建的相同实例。但如果在B中旋转设备,则会重新创建B,而B会执行getInstance()
,但这一次它必须自己创建实例。这一次,它不会使用setSharedPreferences()
进行初始化我的建议是简化你的prefs课程。确保在构建时初始化。也就是说,不要把
getInstance()
和setSharedPreferences()
分开。这样做:当需要进行多种设置时,可以这样使用:
如果只需要一个设置,也可以使用较短的版本:
# 2 楼答案
在使用MySharedPrefManager的数据成员或内容之前,请检查空检查
在MySharedPrefManager类中添加一个getter方法,如下所示:
在访问共享首选项内容的活动中,在onCreate或onResume中,在使用内容之前添加以下内容:
这样你就能避免NPE
# 3 楼答案
不用了,已经有单身汉了。你可以做: