0

我尝试创建自定义类以从 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;
    }
}

可能是什么问题?

4

6 回答 6

1

只需在 util 类中使用此方法即可。无需扩展应用程序。

public static String getToken(Context context) {
   return PreferenceManager.getDefaultSharedPreferences(context).getString("Token", null);
}
于 2015-09-22T08:25:49.690 回答
1

通常 Android 组件在其生命周期内被初始化。在这种特殊情况下,您无法访问应用程序ContextSharedPreferences因为它们尚未初始化。

第二个问题可能是(感谢我的水晶球)您没有添加ApplicationAndroidManifest

因此,您的第一个想法可能是将初始化代码从构造函数移动到onCreate. 这将解决这个特殊问题。

但是,做你正在做的事情是一种不好的做法。Application因为每个应用程序只能有 1 个组件。这会将您限制为每个应用程序 1 个这样的单例。考虑使用作为单例Application提供应用程序Context并创建另一个单例来提供 UserInfo。

没有例子,请自己锻炼。

于 2015-09-22T08:25:22.373 回答
0

android 中有一条规则 - 不要使用应用程序组件的构造函数:Activity/Fragment/Application/Service ... 有 onCreate() 方法,因为在您的构造函数上下文中将为空。因此,将您的代码移至 onCreate()。您还需要将您的 UserInfo 设置为 Manifest 中的应用程序。

于 2015-09-22T08:23:37.027 回答
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();
    }
}
于 2015-09-22T08:23:46.617 回答
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();
于 2015-09-22T08:30:27.383 回答
0

您无需创建 Application 类的构造函数,而是使用以下代码onCreate()

 @Override
 public void onCreate() {
    super.onCreate();
    SharedPreferences prefs = getApplicationContext().getSharedPreferences("UserFile", MODE_PRIVATE);
    token = prefs.getString("Token", null);
 }

并在任何活动中使用它:

UserInfo userInfo = (UserInfo)getApplication();
String token  = userInfo.getToken();
于 2015-09-22T08:24:58.143 回答