0

我正在使用 SharedPreferences 为用户管理一种“会话”并让他们保持登录状态,直到他们明确按下注销,也就是我从 SharedPreferences 中删除所有内容的时候。

当用户登录时,我这样做:

            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( LoginActivity.this);

            prefs.edit()
            .putString("first_name", firstName)
            .putString("last_name", lastName)
            .putString("email", email)              
            .putString("user_id", user_id)
            .commit();

它 90% 的时间都在工作,但每隔一段时间,这些东西就不会被写入 SharedPreferences,导致系统永远不会将用户视为已登录。

知道为什么会发生这种情况吗?这是某些手机的安全问题吗?

注意:当远程服务器在将数据实际添加到数据库后做出响应时,我将这些值放入 SystemPreferences 中,即使将数据添加到数据库中,这些值也不会保存在某些设备上。

这是获取首选项的代码:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( ProblemioActivity.this);

String firstName = prefs.getString( "first_name", null); // First arg is name and second is if not found.
String lastName = prefs.getString( "last_name", null); // First arg is name and second is if not found.
String email = prefs.getString( "email", null); // First arg is name and second is if not found.
String user_id = prefs.getString( "user_id", null ); // First arg is name and second is if not found.

谢谢!!

4

2 回答 2

2

使用 SharedPreferences 存储临时数据(如会话)很好。但是commit您应该使用,而不是使用apply,因为commit只会保存更改,但不会更新已经初始化的首选项对象。当您使用apply时,它会更新偏好对象的值并异步保存(提交)更改。

犯罪()

将您的首选项更改从该编辑器提交回它正在编辑的 SharedPreferences 对象。这会自动执行请求的修改,替换 SharedPreferences 中当前的任何内容。

请注意,当两个编辑器同时修改首选项时,最后一个调用 commit 的人获胜。

如果您不关心返回值并且您在应用程序的主线程中使用它,请考虑改用 apply()。

.

申请()

将您的首选项更改从该编辑器提交回它正在编辑的 SharedPreferences 对象。这会自动执行请求的修改,替换 SharedPreferences 中当前的任何内容。

请注意,当两个编辑器同时修改首选项时,最后一个调用 apply 的人获胜。

与将其首选项同步写入持久存储的 commit() 不同,apply() 会立即将其更改提交到内存中的 SharedPreferences,但会开始异步提交到磁盘,并且不会通知您任何失败。如果此 SharedPreferences 上的另一个编辑器在 apply() 仍然未完成时执行常规 commit(),则 commit() 将阻塞,直到所有异步提交以及提交本身都完成。

由于 SharedPreferences 实例是进程中的单例,因此如果您已经忽略了返回值,则可以安全地将任何 commit() 实例替换为 apply()。

您无需担心 Android 组件生命周期及其与 apply() 写入磁盘的交互。该框架确保在切换状态之前完成来自 apply() 的动态磁盘写入。

于 2012-04-15T19:53:30.933 回答
1

使用两个不同的 SharedPreferences 有危险。

你设置

SharedPreferences prefs = PreferenceManager.
    getDefaultSharedPreferences( LoginActivity.this);

但你读

SharedPreferences prefs = PreferenceManager.
    getDefaultSharedPreferences( ProblemioActivity.this);

我总是对不同的偏好感到困惑。所以我同时使用

activity.getSharedPreference("Key", Mode);

当我想在不同的活动中访问相同的偏好时

于 2012-04-16T08:31:20.800 回答