2017-06-23 109 views
-1

我有一个类A这个类不扩展或实现任何其他类。然后我有一个B类,这个类也不扩展或实现任何其他类。无法初始化SharedPreferences

我的B类仅用于管理SharedPreferences

private static SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); 

这是问题的方法在B类:

public static void setCurrentUsersEmail(String email){ 
    sharedPreferences.edit().putString("userEmail",email).commit(); 
} 

现在A级是一个数据库管理器和需要存储的用户电邮SharedPreferences供以后使用。我这样做是用下面的代码:`

MySharedPrefs.setCurrentUsersEmail(currentUsersEmail); 

然而,当我尝试运行在A类代码中,我得到的错误:

java.lang.ExceptionInInitializerError at com.test.Android.MySharedPrefs.setCurrentUsersEmail(MySharedPrefs.java:0)

我,为什么出现这种情况我不能真的很困惑在搜索后找不到解决方案,我在其他活动中使用我的sharedPreferences类完全正常。这是一个活动问题吗?

任何帮助,非常感谢。

+0

你如何通过''里面getDefaultSharedPreferences mContext' ()'方法 – Aryan

+0

所以我从一个recyclerview适配器调用'setCurrentUsersEmail(currentUsersEmail)'。然后进入A类,在那里检查数据库,然后调用SharedPreferences。当最初创建sharedPreferences时,我从MainActivity调用一个方法来获取它的上下文数据。我不认为在这种情况下发送上下文,虽然 – memoryManagers

回答

0

您可以使用单按您的需求:

public class MyPrefs { 

    private static MyPrefs myPrefs; 
    private SharedPreferences sharedPreferences; 

    private MyPrefs(Context context){ 

     sharedPreferences=context.getSharedPreferences("MyPREFERENCES", Context.MODE_PRIVATE); 
    } 

    public static MyPrefs getInstance(Context context){ 

     if(myPrefs==null) 
      myPrefs=new MyPrefs(context); 
     return myPrefs; 
    } 

    public void setCurrentUsersEmail(String email){ 

     sharedPreferences.edit().putString("userEmail",email).commit(); 
    } 
} 

你可以把电子邮件中这样说:

MyPrefs.getInstance(context).setCurrentUsersEmail(currentUsersEmail); 

你必须在第一时间通过上下文的sharedPreferences在您的类参考。

从活动通话MyPrefs.getInstance(context)一次

然后你就可以没有上下文调用

MyPrefs.getInstance().setCurrentUsersEmail(currentUsersEmail); 

getInstance()方法:

public static MyPrefs getInstance(){ 

     if(myPrefs==null) throw new AssertionError("MyPrefs cannot be null"); 
     else 
     return myPrefs; 
} 
+1

谢谢你这个工作。你能解释一下为什么在这种情况下无法从MainActivity获得sharedPreferenc? – memoryManagers

+0

首先静态变量应该在静态块中初始化并且** PreferenceManager ** - >用于帮助从活动或XML创建首选层次结构** ** SharedPreferences ** - >用于访问和修改由getSharedPreferences返回的首选项数据的接口(String ,int)。对于任何特定的偏好设置,所有客户都共享此类的单个实例。 – Aryan

+0

''PreferenceManager'通常用于创建PreferenceActivity或从应用程序中的.xml文件中加载某些首选项时使用默认值,并且它自己引用SharedPreferences – Aryan

0

你能做到这一点,在任何活动,不需要创建一个新的方法:

为了节省:

SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit(); 
editor.putString("email", "[email protected]"); 
editor.commit(); 

恢复:

SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
String restoredText = prefs.getString("email", null); 

你不能调用MyPrefs。 aFunctionYouCreated()!!!

相关问题