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は変更を保存するだけで、既に初期化されている設定オブジェクトを更新しないため、を使用する代わりに を使用commitする必要があります。また、 applyを使用すると、設定オブジェクトの値が更新され、変更も非同期に保存 ( commit ) されます。apply

専念()

設定の変更を、このエディタから編集中の SharedPreferences オブジェクトにコミットします。これにより、要求された変更がアトミックに実行され、現在 SharedPreferences にあるものはすべて置き換えられます。

2 人の編集者が同時に設定を変更している場合は、コミットを最後に呼び出した方が優先されることに注意してください。

戻り値を気にせず、アプリケーションのメイン スレッドからこれを使用している場合は、代わりに apply() の使用を検討してください。

.

申し込み()

設定の変更を、このエディタから編集中の SharedPreferences オブジェクトにコミットします。これにより、要求された変更がアトミックに実行され、現在 SharedPreferences にあるものはすべて置き換えられます。

2 人のエディターが同時に設定を変更している場合は、最後に適用を呼び出したエディターが優先されることに注意してください。

設定を永続ストレージに同期的に書き込む commit() とは異なり、apply() は変更をメモリ内の SharedPreferences にすぐにコミットしますが、ディスクへの非同期コミットを開始するため、失敗は通知されません。この SharedPreferences の別のエディターが通常の commit() を実行し、apply() がまだ未解決の場合、commit() はすべての非同期コミットとコミット自体が完了するまでブロックされます。

SharedPreferences インスタンスはプロセス内のシングルトンであるため、既に戻り値を無視している場合は、commit() のインスタンスを apply() に置き換えても安全です。

Android コンポーネントのライフサイクルや、apply() によるディスクへの書き込みとの相互作用について心配する必要はありません。フレームワークは、状態を切り替える前に、apply() からの進行中のディスク書き込みが完了していることを確認します。

于 2012-04-15T19:53:30.933 に答える
1

2 つの異なる SharedPreferences を使用すると危険です。

あなたが設定した

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

しかし、あなたは読んだ

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

さまざまな設定にいつも混乱します。だから私はその間に使用します

activity.getSharedPreference("Key", Mode);

異なるアクティビティ間で同じ設定にアクセスしたい場合

于 2012-04-16T08:31:20.800 に答える