1

クラス内の他の定数と一緒に呼び出される非最終的な静的SharedPreferencesオブジェクトを宣言しました。PREFSConstants.java

public static SharedPreferences PREFS = null;

そうする理由は、私のアプリが同じ共有設定ファイルにアクセスし続ける約6つの異なるもので構成されており、毎回AsyncTasks取得したくなかったからです。アプリの最初の実行時に、in myを呼び出してに保存し、 が起動される前にインスタンスを指すようにして、 .SharedPreferencesEditorgetSharedPreferences()MainActivityPREFSAsyncTaskNullPointerException

しかし、とにかくNullPointerExceptions から s を取得し続けました。AsyncTaskすべてのスタック トレースは、値を取得するために呼び出しを行う行を指していConstants.PREFSます。私の理論では、Android はしばらくするとアプリのプロセスを強制終了するため、次にいずれかの のアラームが鳴ったときにAsyncTask、 の値Constants.PREFSはすでに になっていますnull

私の質問は:Context代わりに静的変数を作成する必要がありますか? Android がプロセスを強制終了しても、その状態は保持されますか? 後者がインスタンス化されて を呼び出すことができるようになると、私Contextは常に の参照を渡します。ただし、 Android ドキュメントからの拡張は見られません。AsyncTaskgetSystemService()NullPointerExceptionContextSerializable

4

1 に答える 1

2

クラスを使用Applicationして、アプリケーション全体で設定をグローバルに共有します。

public class MyApp extends Application {
    private static Context mAppContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mAppContext = getApplicationContext();
    }

    public static SharedPreferences getPreferences(){
        return mAppContext.getSharedPreferences("my_app_preferences",MODE_MULTI_PROCESS);
    }
}

マニフェストで言及することにより、カスタム Application クラスが必要であることを Android に伝えます。

<application android:name=".MyApp" android:label="@string/app_name" android:icon="@drawable/ic_launcher">

どこからでも電話をかけるだけ

MyApp.getPreferences().edit().putBoolean("pref1",true). . . put more stuff . .commit()

MODE_MULTI_PROCESSすべての AsyncTask スレッドが の同じインスタンスに同期してアクセスできるようにしますSharedPreferences。また、commit()アトミックであり、ディスクへの変更を永続化します。

上記のパターンは、どこからでもリソースにアクセスする場合にも便利です。

アップデート

Instant Runコンテキストへの静的参照は、新しい機能で問題を引き起こすようです。

したがって、ユーティリティ メソッドのパラメーターとしてコンテキストが必要になる場合があります。

public static SharedPreferences getPreferences(context){
    return context.getSharedPreferences("my_app_preferences",MODE_MULTI_PROCESS);
}
于 2012-10-29T05:12:30.530 に答える