Android - 将Object保存到SharedPreferences并在应用程序中的任何位置获取它

und*_*oid 3 java android gson sharedpreferences

在我的应用程序中,我有一个自定义User类,它包含一些常规数据(名称等...).我需要保存该对象并随时随地在应用程序的其他页面中获取它.我public final class GeneralMethods用很多方法制作了一个助手类,我经常使用它(当然是静态的).
为了使用Gson库保存数据Im .我做了这个方法:

public static void saveData(Context con, String variable, String data)
{
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(con);
    prefs.edit().putString(variable, data).apply();
}
Run Code Online (Sandbox Code Playgroud)

要保存对象,我使用此方法如下:

Gson gson = new Gson();
String stringUser = gson.toJson(newUser);    
GeneralMethods.saveData(VerificationActivity.this,"userObject",stringUser);
Run Code Online (Sandbox Code Playgroud)

要重新加载数据,我正在使用这个静态方法:

public static String getData(Context con, String variable, String defaultValue)
{
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(con);
    String data = prefs.getString(variable, defaultValue);
    return data;
}
Run Code Online (Sandbox Code Playgroud)

我真的不知道如何获取数据,这是我到目前为止所做的:

Gson gson = new Gson();
String user="";
String value="";
user = GeneralMethods.getData(SplashScreenActivity.this,value,"userObject");
Run Code Online (Sandbox Code Playgroud)

我正在努力解决这个问题getData,如何解析数据从String回到User类型?


编辑
我尝试了下面的建议,我总是得到NULL.也许我不以正确的方式保存对象?


EDIT2
似乎我没有正确生成对象,因此没有任何东西被保存.这是用户"Singleton"类:

public class User implements Serializable {

    private static User userInstance=null; //the only instance of the class
    private static String userName; //userName = the short phone number
    private User(){}

    public static User getInstance(){
        if(userInstance ==null){
            userInstance = new User();
        }
        return userInstance;
    }

    public static User getUserInstance() {
        return userInstance;
    }

    public String getUserName(){
        return this.userName;
    }

    public static void setUserName(String userName) {
        User.userName = userName;
    }

    public static void init(String _userName) {
        User.setUserName(_userName);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我如何使用相关数据(用户名作为构造函数参数)设置对象:

   User.init(name);
Run Code Online (Sandbox Code Playgroud)

这是我如何将对象转换为String:

   Gson gson = new Gson();
    String stringUser = gson.toJson(User.getInstance());
GeneralMethods.saveData(VerificationActivity.this,"userObject",stringUser);
Run Code Online (Sandbox Code Playgroud)

And*_*eam 5

用以下替换现有的User类

public class User implements Serializable
{

    private static User userInstance = null; // the only instance of the class
    private String userName; // userName = the short phone number
    private User(){}
    public static User getInstance()
    {
        if (userInstance == null)
        {
            userInstance = new User();
        }
        return userInstance;
    }

    public String getUserName()
    {
        return userName;
    }

    public void setUserName(String p_userName)
    {
        userName = p_userName;
    }

    @Override
    public String toString()
    {
        return "User [userName=" + getUserName() + "]";
    }
}
Run Code Online (Sandbox Code Playgroud)

初始化用户名

User m_user = User.getInstance();
m_user.setUserName(name);
Run Code Online (Sandbox Code Playgroud)

将对象转换为String

Gson gson = new Gson();
String stringUser = gson.toJson(m_user);
GeneralMethods.saveData(VerificationActivity.this,"userObject",stringUser);
Run Code Online (Sandbox Code Playgroud)