4

ユーザーがウィジェットをホーム画面に配置すると、ウィジェットに関する情報を書き込むサービスを作成しました (情報は構成アクティビティから取得されます)。また、ユーザーが設定したウィジェットの数も書き留めます。

ユーザーがウィジェットを削除したら、共有設定でその情報を削除します。

私が経験したことは、ユーザーがたとえば 2 つのウィジェットを配置し、1 つを削除してからもう一度配置し、これらすべてのアクションを高速に実行すると、共有設定ファイルが一貫性のない値を取得することです。うまくいくこともありますが、ほとんどの場合、間違った値で立ち往生します。

apply() を使用しています。commit を試しましたが、同じことが起こります。

共有設定に保存する値は、システムが機能するために重要です。それがないと、設定に書き込まれたユーザー構成に基づいてインターネットからの情報によってバックアップされるため、ウィジェットは役に立ちません。

データベース ソリューションへの切り替えはより信頼性が高いですか、それともこの「競合状態」を修正する他の実行可能なソリューションですか? (おそらく私自身の同期メカニズムを強制するかもしれませんが、ドキュメントから理解している限り、apply()はすでに同期されており、読み取り/書き込みは最初にRAMに移動する必要があります。これにより高速になり、次のような問題が発生することはありませんこれは、ユーザーが物理的にウィジェットを削除して新しいウィジェットを 2 ~ 3 秒以内に配置することができないためです!)

4

1 に答える 1

0

SharedPreferences自体を操作する際に、 synchronizedキーワードを使用してみてください。たとえば、Android アプリの SharedPreferences でアプリケーション文字列を設定するときに使用できるメソッドを次に示します。

public synchronized static void setAppString(Context context, String pref,
                                             String val) {
    SharedPreferences sp = context.getSharedPreferences(
            APP_PREFS_UNIQUE_ID, Context.MODE_PRIVATE);
    Editor editor = sp.edit();
    editor.putString(pref, val);
    editor.commit();
}

少数/単純なキーと値のペアの場合、データベース パラダイムのオーバーヘッドは必要ない場合があります。

于 2013-08-13T15:09:43.267 に答える