2017-07-27 3 views
1

私はSharedPreferencesにアクセスする必要があるだけで一つのクラスがあります。私はこの試みたコンテキスト参照を渡さずにクラス内の静的メソッドからAndroid SharedPreferencesにアクセスするにはどうすればよいですか?

public class MyUtils { 

    public static String packageMe(Object input){ 
     // do stuff here 
     // need SharedPreferences here 
    } 

    public static Object unpackageMe(String input){ 
     // do stuff here 
     // need SharedPreferences here 
    } 
} 

を:

public class MyUtils extends Activity 

をしかし、あなたが知っているように、私は静的メソッドからSharedPreferencesにアクセスすることはできません。

私は静的メソッドにコンテキストを渡して考えたが、それは私が変更する必要があります4つのうちのクラスの数を拡張し、クラスがすでにAsyncTaskを拡張されています

public class SomeClass01 extends AsyncTask { 
    @Override 
    protected Object doInBackground(Object[] params){ 
     MyUtils.packageMe(abc_123_object); 
     // do stuff here 
    } 
} 

ので、おそらく私はこれらの4つのクラスに文脈を渡すことができると思った。しかし、私はこれらの4つのクラスを使用するように変更する必要がある数十のクラスがあります。つまり、そのクラスを使用します。

public class SomeTopClass extends FragmentActivity implements x, y, z { 
    new SomeClass01.execute(abc_123_object); 
    // do stuff here 
} 

コンテキスト参照を自分のコードの深いところに渡したいと思っているのかどうかわかりません。

SharedPreferencesへの参照を私のabc_123_objectモデルに置くことについてStackOverflowで見ましたが、(abc_123_object以外の)私が使用するかなりのオブジェクトがあります。ジェリーリグにたくさんのクラスを持たせたくありません。

これは、何十ものクラスを変更したり、コードの周りにコンテキスト参照を渡したりすることなく、これを行う方法ですか?

おかげ

+1

を見てみましょう:かなり甘いですhttps://stackoverflow.com/a/5114361/461810 – Dusan

+0

@Dusanすごい迫力...を!これは "安全"ですか? – Brian

+0

私の経験から、はい、それは安全です。 このアプローチは、いくつかのアプリケーションで使用されています - 非同期タスク、バックグラウンドスレッド、すべて同じ静的コンテキストを使用し、問題なし。 – Dusan

答えて

0

ドゥシャンは、アプリケーションクラスを使用すると、これを行うための簡単な方法で、前述のように:あなたのアプリケーションクラスでは

を:onCreate()

private static MyApplication sInstance = null; 

private SharedPreferences mPrefs 

public static MyApplication getApp() 
{ 
    return sInstance; 
} 

public SharedPreferences getSharePreferences() 
{ 
    return mPrefs; 
} 

sInstance = this; 
mPrefs = getSharedPreferences(PREF_FILE, MODE_PRIVATE); 

あなたのコードでは、単に次のようにしてください:

MyApplication.getApp().getSharePreferences(); 

あなたのアプリケーションのonCreate()は、アクティビティが作成される前に実行されることが保証されています。本当に変わったことをしない限り、安全でなければなりません。

0

アプリケーションクラスに静的変数を作成します。

public class MyApp extends Application{ 
    public static Context context; 
@Override 
    public void onCreate() { 
    context = this; 
    } 
} 

必要なときに使用します。

public static String packageMe(Object input){ 
     // do stuff here 
     // need SharedPreferences here 
     // context = MyApp.context 
    } 
関連する問題