非活动类NullPointerException中的SharedPreferences

时间:2016-11-30 17:50:12

标签: java android nullpointerexception sharedpreferences

我正在尝试在SharedPreferences的非activity类中使用onResume(),但我在context上收到NullPointerException。

出于某种原因,我无法在context中获得onResume()。不确定我是否遗漏了什么,但任何帮助都会受到赞赏。

我的活动中的

onResume()方法

@Override
protected void onResume() {
    super.onResume();
    // The activity has become visible (it is now "resumed").

    // Check User's Access Token exists and hasn't expired.
    AccountFunctions accountFunctions = new AccountFunctions();

    if (!accountFunctions.validateUserToken(this)) {
        Intent intent = new Intent(this, LoginActivity.class);
        startActivity(intent);
    }
}
AccountFunctions类中的

validateUserToken(上下文关联)方法

public Boolean validateUserToken(Context context) {

    SharedPreferences sharedPref = context.getSharedPreferences(getString(R.string.user_file_key), Context.MODE_PRIVATE); // This is where the error is thrown
    String accessToken = sharedPref.getString(getString(R.string.user_access_token), null);
    DateTime expiryDate = new DateTime(sharedPref.getLong(getString(R.string.user_expires), 0));

    if (accessToken == null || expiryDate.isBeforeNow()) {
        return false;
    } else {
        return true;
    }
}

错误

  

java.lang.RuntimeException:无法恢复活动   {uk.co.itsstonbury.www.intouch / uk.co.itsstonbury.www.intouch.MainActivity}:   java.lang.NullPointerException:尝试调用虚方法   “android.content.Context   空对象上的android.content.Context.getApplicationContext()'   参考

2 个答案:

答案 0 :(得分:3)

getString(R.str替换为context.getString,因为操作系统尚未创建AccountFunctions类,因此它没有自己的上下文准备好。

基本上,当操作系统回调调用oncreate函数时,活动会获取它的上下文表单应用程序,因为在这种情况下它不会发生,因此AccountFunctions对象将没有它自己的上下文

此代码简单地假设AccountFunctions将通过intent正常创建,但在这种情况下,它就像一个简单的类对象,它与活动生命周期调用没有任何关联。

所以你的代码看起来像

public Boolean validateUserToken(Context context) {

    SharedPreferences sharedPref = context.getSharedPreferences(context.getString(R.string.user_file_key), Context.MODE_PRIVATE); // This is where the error is thrown
    String accessToken = sharedPref.getString(context.getString(R.string.user_access_token), null);
    DateTime expiryDate = new DateTime(sharedPref.getLong(context.getString(R.string.user_expires), 0));

    if (accessToken == null || expiryDate.isBeforeNow()) {
        return false;
    } else {
        return true;
    }
}

或者您可以直接使用字符串值

    SharedPreferences sharedPref = context.getSharedPreferences("yourkey", Context.MODE_PRIVATE); // This is where the error is thrown

更好的选择是为辅助函数创建一个单独的Util类,而不是像

class Util{

    public static boolean validateUserToken(Context context) {

        SharedPreferences sharedPref = context.getSharedPreferences(context.getString(R.string.user_file_key), Context.MODE_PRIVATE); // This is where the error is thrown
        String accessToken = sharedPref.getString(context.getString(context.R.string.user_access_token), null);
        DateTime expiryDate = new DateTime(sharedPref.getLong(context.getString(R.string.user_expires), 0));

        if (accessToken == null || expiryDate.isBeforeNow()) {
            return false;
        } else {
            return true;
        }
    }
}
来自您活动的

称之为

 Util.validateUserToken(this);

答案 1 :(得分:0)

替换SharedPreferences sharedPref = context.getSharedPreferences(getString(R.string.user_file_key), Context.MODE_PRIVATE);
SharedPreferences sharedPref = context.getSharedPreferences(context.getString(R.string.user_file_key), Context.MODE_PRIVATE);