在Android应用程序中存储会话状态

时间:2013-12-06 09:16:00

标签: android session architecture

我知道这个问题比较频繁,但看起来无论如何我都要问它。

我正在开发一款网络游戏。该应用程序保存当前用户的帐户信息,团队信息,单位,私人消息等,以提供对它们的永久访问。我已经创建了一个包含所有这些内容的类,现在我每次都在应用启动时加载会话数据,显示启动活动。会话数据实例位于Application类子级。

每次,在每个Activity的onCreateonResume中,我都会检查会话数据是否存活,如果不存在,我会启动splash活动来重新加载它。我知道这种做法是一种不好的做法,但它看起来像是管理会话的最快方法。

最近,我开始对我的应用进行beta测试,并且在面向会话数据对象的对象中遇到了大量NPE,尽管我进行了onCreateonResume检查。

有人能建议更好地解决这个问题吗?

此外,

  • 会话数据有大量要存储的对象类型,因此为它们创建所有数据库真的很乏味;
  • 会话数据经常在服务器上修改,因此加载所有内容并永久使用并不是一个好主意。

3 个答案:

答案 0 :(得分:1)

SharedPreferences是解决此类问题的更好方法。

下面的代码显示了一个可用于保存和获取用户数据的类

    public class SharedPreferencesClass {
    public static final String PREFS_NAME = "MyPrefsFile";
    public static final int PRIVATE_MODE = 0;
    public SharedPreferences setting;
    public SharedPreferences.Editor editor;

    public SharedPreferencesClass(Context context) {
        setting = context.getSharedPreferences(PREFS_NAME, PRIVATE_MODE);
    }

    //Save user data by calling this method
    public void setLoginData(String userId, String userName, String email,
            String image_str, String about) {
        editor = setting.edit();
        editor.putBoolean("Login", true);
        editor.putString("UserID", userId);
        editor.putString("UserName", userName);
        editor.putString("Email", email);
        editor.putString("About", about);
        editor.commit();
    }

    //An example of editing some of the user data
    public void setEditedData(String email, String image_str ,String about) {
        editor = setting.edit();
        editor.putString("Email", email);
        editor.putString("About", about);
        editor.commit();
    }

    //this method for clearing all of the user information
    public void clearPerferance() {
        editor = setting.edit();
        editor.clear();
        editor.commit();
    }

    //The below methods is for getting specific data that you saved it the shared preference ...

    public boolean isLogin() {
        return setting.getBoolean("Login", false);
    }

    public String getUserName() {
        return setting.getString("UserName", "");
    }

    public String getUserID() {
        return setting.getString("UserID", "");
    }

    public String getEmail() {
        return setting.getString("Email", "");
    }

    public String getAbout() {
        return setting.getString("About", "");
    }

}

此处还有tutorial解释并说明如何使用SharedPreferences

答案 1 :(得分:1)

您需要将对象存储到SharedPreferences。据我所知,你不能把对象放到SharedPreferences。所以你需要做一些技巧。我认为这个解决方案对您来说已足够了:

SharedPreferences  mPrefs = getPreferences(MODE_PRIVATE);

保存

 Editor prefsEditor = mPrefs.edit();
 Gson gson = new Gson();
 String json = gson.toJson("MyObject");
 prefsEditor.putString("MyObject", json);
 prefsEditor.commit();

要退却

Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);

此代码来自 "this quesiton" MuhammadAamirALi

答案 2 :(得分:0)

每次都不要启动闪屏。它会降低应用程序的性能,只需创建一个加载会话数据的方法,并在会话不存在时调用它。并在应用程序的共享首选项中加载会话数据。