web-dev-qa-db-ja.com

共有設定におけるcommit()とapply()の違いは何ですか

私は自分のAndroidアプリで共有設定を使用しています。共有設定のcommit()メソッドとapply()メソッドの両方を使用しています。 AVD 2.3を使用してもエラーが表示されませんが、AVD 2.1でコードを実行すると、apply()メソッドでエラーが表示されます。 SOこれら2つの違いは何ですか?そしてcommit()だけを使って問題なく設定値を保存できますか?

393
Andro Selva

apply()は2.3で追加されました、それは成功または失敗を示すブール値を返さずにコミットします

commit()は、保存がうまくいった場合にtrueを返し、そうでなければfalseを返します。

apply()は、Androidの開発チームが、ほとんど誰もが戻り値に気付かなかったことに気付いたので追加されました。そのため、applyは非同期であるため高速です。

http://developer.Android.com/reference/Android/content/SharedPreferences.Editor.html#apply()

605
Ray Britton

tl; dr:

  • commit()はデータを書き込みます同期的に(呼び出し元のスレッドをブロックします)。それはそれから通知あなたが操作の成功についてあなたに。
  • apply()はデータの書き込みをスケジュールします非同期的に。それは通知しないあなたが操作の成功についてあなたに知らせます。
  • apply()で保存し、getXメソッドですぐに読むとすると、newという値が返されます。
  • ある時点でapply()を呼び出してもまだ実行中の場合、commit()への呼び出しは、過去のすべてのapply-Callおよび現在のcommit-callが終了するまでブロックされます。

SharedPreferences.Editor ドキュメントからのより詳細な情報:

commit()は設定を永続的ストレージに同期的に書き出しますとは異なり、apply()は変更をメモリ内のSharedPreferencesに即座にコミットしますが、ディスクへの非同期コミットを開始して勝ちます」障害が発生した場合は通知を受け取る。 apply()が未解決のままで、このSharedPreferencesの別のエディターが通常のcommit()を実行した場合、commit()は、コミット自体と同様にすべての非同期コミットが完了するまでブロックします。

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

SharedPreferences.Editorインターフェイスは直接実装されることは想定されていません。ただし、以前にそれを実装していて、apply()がないことに関するエラーが発生している場合は、単にapply()からcommit()を呼び出すことができます。

195
Lukas Knuth

私はapply()の代わりにcommit()を使っていくつかの問題を経験しています。他の応答で前述したように、apply()は非同期です。私は、「文字列セット」設定に加えられた変更が永続メモリに書き込まれないという問題を抱えています。

それはあなたがプログラムを "強制的に拘留"した場合、またはプロセスがメモリの必要性のためにシステムによって殺されたときに、私がAndroid 4.1で私のデバイスにインストールしたROMで起こる。

設定を有効にしたい場合は、「apply()」ではなく「commit()」を使用することをお勧めします。

22
JoseLSegura

Apply()を使用してください。

変更はすぐにRAMに書き込まれ、その後、内部ストレージ(実際の設定ファイル)に書き込まれます。コミットは、変更を同期的に直接ファイルに書き込みます。

13
MurWade

ドキュメントには、 apply()commit() の違いについてかなりよく説明されています。

設定を永続的ストレージに同期的に書き出すcommit()とは異なり、apply()は変更をメモリ内のSharedPreferencesに即座にコミットしますが、ディスクへの非同期コミットを開始しますので、失敗することは通知されません。 commit()がまだ未解決である間に、このSharedPreferences上の別のエディタが通常のapply()を行う場合、commit()は、すべての非同期コミットとコミット自体が完了するまでブロックします。 SharedPreferencesインスタンスはプロセス内のシングルトンなので、すでに戻り値を無視している場合は、commit()のインスタンスをapply()に置き換えても安全です。

12
Mojo Risin
  • commit()は同期的で、apply()は非同期的です

  • apply()は無効な関数です。

  • 新しい値が永続ストレージに正常に書き込まれた場合、commit()はtrueを返します。

  • apply()は状態を切り替える前に完全を保証します、あなたはAndroidコンポーネントライフサイクルについて心配する必要はありません

commit()から返された値を使わず、メインスレッドからcommit()を使っている場合は、apply()の代わりにcommit()を使ってください。

12
Nurlan Sofiyev

Javadocから:

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

6
Vladimir Ivanov

Commit()とapply()の違い

SharedPreferenceを使用している場合、これら2つの用語に混乱する可能性があります。基本的にはおそらく同じなので、commit()とapply()の違いを明確にしましょう。

1.戻り値:

apply()は、成功または失敗を示すブール値を返さずにコミットします。 commit()は、保存が機能する場合はtrueを返し、そうでない場合はfalseを返します。

  1. 速度:

apply()は高速です。 commit()は遅いです。

  1. 非同期対同期:

apply():非同期commit():同期

  1. アトミック:

apply():アトミックcommit():アトミック

  1. エラー通知:

apply():いいえcommit():はい

0
ORBIT