我尝试创建自定义类以从SharedPreferences中获取一些值。 我的目标是从任何阶级达到这些价值观。
我在
上得到空指针异常 SharedPreferences prefs = getApplicationContext().getSharedPreferences("UserFile", MODE_PRIVATE);
我的代码如下;
public class UserInfo extends Application {
private String token;
private String SAVED_USERNAME;
public UserInfo() {
SharedPreferences prefs = getApplicationContext().getSharedPreferences("UserFile", MODE_PRIVATE);
token = prefs.getString("Token", null);
}
public String getToken() {
return token;
}
}
可能出错了什么?
答案 0 :(得分:1)
通常,Android组件在其生命周期中进行初始化。在这种特殊情况下,您无法访问应用Context
和SharedPreferences
,因为它们尚未初始化。
第二个问题可能是(感谢我的结晶球)您没有将Application
添加到AndroidManifest
因此,您首先想到的可能是将初始化代码从构造函数移动到onCreate
。这将解决这个特殊问题。
但是,做你正在做的事情是不好的做法。因为每个应用程序只能有1 Application
个组件。这将限制你每个应用程序1个这样的单身人士。考虑使用Application
将应用程序Context
作为单例并创建另一个单例以提供UserInfo。
没有例子,请自己锻炼。
答案 1 :(得分:1)
在util类中使用此方法。无需延长申请。
public static String getToken(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getString("Token", null);
}
答案 2 :(得分:0)
android中有一条规则 - 不要使用app组件的构造函数:Activity / Fragment / Application / Service ...有onCreate()方法,因为在你的构造函数上下文中将为null。所以将代码移动到onCreate()。您还需要在Manifest中将UserInfo设置为应用程序。
答案 3 :(得分:0)
确保您已在AndroidManifest.XML文件中注册此课程。
<application android:name=".UserInfo"
...
/>
注意:您访问共享偏好设置的方式似乎不太好。我宁愿自己声明一个名为PreferencesHelper
的类,并将所有首选项放在那里。
public class PreferencesHelper{
private SharedPreferences mPrefs;
public PreferencesHelper(Context context){
this.mPrefs = context.getSharedPreferences("name", Context.MODE_PRIVATE);
}
public getToken() {
return mPrefs.getString("Token", null);
}
public String setToken(String token) {
mPrefs.edit().putString("Token", token).apply();
}
}
答案 4 :(得分:0)
public class MyApp extends Application {
private static MyApp _instance;
@Override
public void onCreate() {
super.onCreate();
_instance = this;
}
public static MyApp getInstance(){
return _instance;
}
public String getToken() {
return getSharedPreferences("UserFile", MODE_PRIVATE).getString("Token", null);
}
}
在你的清单中:
<application
android:name="your.package.MyApp"
>
如果您使用:
String token = MyApp.getInstance().getToken();