Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单身共享偏好问题_Java_Android_Nullpointerexception_Singleton_Sharedpreferences - Fatal编程技术网

Java 单身共享偏好问题

Java 单身共享偏好问题,java,android,nullpointerexception,singleton,sharedpreferences,Java,Android,Nullpointerexception,Singleton,Sharedpreferences,这只是我的应用程序的一个示例 我创建了一个singleton共享首选项,它使用自定义共享首选项管理器类编辑共享首选项数据值: public class MySharedPrefManager { private static MySharedPrefManager instance= null; private static SharedPreferences SharedPref; private static Editor SPEditor; private

这只是我的应用程序的一个示例

我创建了一个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
        }
    }
}
现在,我面临的问题是,有时在活动A和D中调用myPref.isAdmin()时,我会在myPref.isAdmin()中出现空指针异常。但大多数情况下,它是有效的

我还需要在每个活动中设置共享引用(调用setSharedPreferences()方法)?我觉得不需要设置,因为它是单例类

我重复一遍,我正在使用getApplicationContext()设置SharedReference上下文,因为它是单例的,我正在整个应用程序中使用它


已编辑:有3-4个共享首选项,我正在使用相同的结构。。与类似的问题。使用此首选项管理器.getDefaultSharedReferences(上下文),我将只能使用一个SharedReference,这是默认的SharedReference。

不需要,已经有一个singleton。你可以做:

PreferenceManager.getDefaultSharedPreferences(context);

在使用MySharedPrefManager的数据成员或内容之前,请检查null检查

在MySharedPrefManager类中,添加如下getter方法:

public SharedPreferences getSharedPreference(){
    return SharedPref;
}
public class MySharedPrefManager {
    private SharedPreferences sharedPref;

    private MySharedPrefManager(Context context) {
        sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
    }

    public static MySharedPrefManager from(Context context) {
        return new MySharedPrefManager(context);
    }

    public void setAdmin(boolean pAdmin) {
        sharedPref.edit().putBoolean("isAdmin", pAdmin).apply();
    }

    public boolean isAdmin() {
        return sharedPref.getBoolean("isAdmin", false);
    }
}
在访问共享首选项内容的活动中,在onCreate或onResume中,在使用内容之前添加以下内容:

myPref= MySharedPrefManager.getInstance();
if(myPref.getSharedPreference()==null){
    myPref.setSharedPreferences(getApplicationContext());
}

通过这种方式,您将能够避免NPE。

空指针异常可能是由于您的单例未初始化引起的。我想在旋转设备时会发生这种情况

我预计会发生以下情况:在活动A中,您执行
getInstance()
setSharedPreferences()
。在活动B中,您只需执行
getInstance()
,并期望获得在A中创建的相同实例。但如果在B中旋转设备,则会重新创建B,该设备将执行
getInstance()
,但这一次它必须自己创建实例。这一次,它不会使用
setSharedPreferences()
进行初始化

我的建议是让你的prefs课程更简单。确保在构造时初始化。也就是说,不要将
getInstance()
setSharedPreferences()
分开。这样做:

public SharedPreferences getSharedPreference(){
    return SharedPref;
}
public class MySharedPrefManager {
    private SharedPreferences sharedPref;

    private MySharedPrefManager(Context context) {
        sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
    }

    public static MySharedPrefManager from(Context context) {
        return new MySharedPrefManager(context);
    }

    public void setAdmin(boolean pAdmin) {
        sharedPref.edit().putBoolean("isAdmin", pAdmin).apply();
    }

    public boolean isAdmin() {
        return sharedPref.getBoolean("isAdmin", false);
    }
}
当您需要进行多种设置时,可以这样使用:

MySharedPrefManager prefs = MySharedPrefManager.from(this);
prefs.setAdmin(true);
prefs.setSomethingElse();
boolean isFoo = prefs.isFoo();
如果只需要一个设置,请使用较短的版本:

MySharedPrefManager.from(this).setAdmin(true);

尝试
PreferenceManager.getDefaultSharedReferences(上下文)