2

4以降のすべてのAndroidAPIにSharedPreferencesを適用するために次のコードを使用したいと思います。

/**
 * The apply method was introduced 
 * in Android API level 9.<br> Calling it causes a safe asynchronous write 
 * of the SharedPreferences.Editor object to be performed. Because
 * it is asynchronous, it is the preferred technique for saving SharedPreferences.<br> 
 * So we should use appropriate method if we doesn`t need confirmation of success.
 * In this case we should use old commit method.
 */
@TargetApi(9)
    public static void applySharedPreferences(SharedPreferences.Editor editor){
    if (Build.VERSION.SDK_INT < 9){
        editor.commit();
    } else {
        editor.apply();
    }
}

プロジェクトターゲットAPIは10です(プロジェクトプロパティで設定)。API 8で正常に動作しますが、API 4で実行しようとすると、次のメッセージでクラッシュします。

11-18 20:21:45.782: E/dalvikvm(323): Could not find method android.content.SharedPreferences$Editor.apply, referenced from method my.package.utils.Utils.applySharedPreferences

通常はデバイスにインストールされますが、起動中にクラッシュします。このメソッド(適用)がこのAPIで使用されていないのに、なぜ発生するのですか?

ありがとう

4

2 に答える 2

5

API 8で正常に動作しますが、API 4で実行しようとすると、次のメッセージでクラッシュします。

Android 1.xのDalvikは非常に保守的であり、解決できない参照を含むクラスを読み込もうとするとクラッシュします。この場合は、apply()です。あなたの選択は次のとおりです。

  1. Android 1.xのサポートを終了する、または

  2. を使用しないでくださいapply()。ただし、常にcommit()独自のバックグラウンドスレッドで使用するか、

  3. をパラメータとして受け取り、それを呼び出すGingerbreadHelper静的apply()メソッドを使用して、別のクラス(たとえば)を作成します。次に、の代わりにを使用するように変更します。Android 1.xデバイスにロードしない限り、を回避できます。SharedPreferences.Editorapply()applySharedPreferences()GingerbreadHelper.apply(editor)editor.apply()GingerbreadHelperVerifyError

于 2012-11-18T20:58:27.850 に答える
1

それは間違った方法ではありませんか?

それはすべきではありません:

@TargetApi(9)
public static void applySharedPreferences(SharedPreferences.Editor editor)
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD)
    {
        editor.apply();
    }
    else
    {
        editor.commit();
    }
}

それはあなたのためなら修正されます!

さらに良いですが!

@TargetApi(Build.VERSION_CODES.GINGERBREAD)
public static void applySharedPreferences(final SharedPreferences.Editor editor)
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD)
    {
        editor.apply();
    }
    else
    {
        new AsyncTask<Void, Void, Void>(){
            @Override
            protected Void doInBackground(Void... params)
            {
                editor.commit();
                return null;
            }
        }.execute();
    }
}

今では常に非同期です!

于 2012-11-18T20:33:48.830 に答える