4

より一般的な質問がありますが、Android 開発中に出くわしました:

よく使用される独自のメソッドを共有するにはどうすればよいですか? たとえば、キーによる共有設定の取得は、常に同じコードです。しかし、別のフラグメントまたはアクティビティで使用する必要がある場合は、常に同じコードをコピーする必要があります。

private void setSharedPrefs(String key, String value) {
    SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString(key, value).commit();
}

これをpublic staticGlobalUtils クラスなどにするのは良い習慣ですか? この種の機能をどのように処理しますか?

4

3 に答える 3

2

GlobalUtils などの静的クラスや、専用のクラスを作成することもできますSharedPreferences。オブジェクトContextを取得できるように、メソッドに a を渡すだけです。SharedPreferences必要なだけこれを使用できます。私はこれらのクラスを数え切れないほど作りました。私はスレッドセーフなSharedPreferencesラッパーさえ持っています:-)

編集:コードをもう一度見てみると、SharedPreferenceラッパーの半分は静的で、残りは遅延インスタンス化されています。そうは言っても、コードの残りの部分がどちらか一方の方向に進む必要がない限り、快適に感じる方を実行する必要があると思います。

于 2012-05-20T20:47:57.353 に答える
1

はい、公開静的にすることができます:

public static void setSharedPrefs(Context context, String key, String value) {
    SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString(key, value).commit();
}

アクティビティが終了した後もコンテキストを保持する可能性がある状況には注意してください。これは悪いことです。

あなたが説明するより可能性の高いシナリオは、次のようなクラスを作成することです。

public class MyPrefs {

     SharedPreferences settings;
     SharedPreferences.Editor editor;


     public MyPrefs(Context context){
        settings = PreferenceManager.getDefaultSharedPreferences(context);
        editor = settings.edit();
     }

     public void saveName(String name){
          editor.putString("name", name).commit();
     } 

}

Application を拡張するクラスでこのクラスを遅延初期化し、そこに取得するためのゲッターを次のように使用します。

 MyPrefs prefs = ((MyAppication) getContext().getApplicationContext()).getMyPrefs();

次のように使用します。

 prefs.saveName("blundell");

編集

遅延初期化の例:

private MyPrefs prefs;

public MyPrefs getMyPrefs(){
     if(prefs == null){
          prefs = new MyPrefs(this);
     }
     return prefs;
}

: これは拡張するクラス内の遅延初期化であるApplicationためthis、アプリケーション コンテキストを参照し、アプリケーションの存続期間中存続します。アクティビティ コンテキストを使用している場合は、遅延初期化を使用したくないでしょう。(アプリケーションコンテキストを使用してください! )

于 2012-05-20T20:51:20.193 に答える
0

私は通常、別のクラスの静的メソッド内に共通のコードを記述します。そのため、毎回新しいクラス オブジェクトを作成することなく、プロジェクトのどこでも静的メソッドを呼び出すことができます。

于 2012-05-20T20:50:45.433 に答える