我正在尝试在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()' 参考
答案 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);