質問に対する別の編集(2016)
最近(2016年以降)私が行ってきたこと、そして開発者への私の提案は次のとおりです。
Dagger 2 を使用するContext
だけです。
@Inject Context context;
以上です。その間に、シングルトンになる他のすべてのものを注入します。
編集/改善された回答(2014)
この回答は人気が高まっているため、最近 (2014 年 7 月現在) 使用しているもののサンプル コードを使用して、独自の回答を改善します。
アプリケーションにそれ自体への参照を保持させることから始めます。
public class App extends Application {
private static App instance;
public static App get() { return instance; }
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
}
次に、アクセスが必要なシングルトンで、context
ここで説明されているように、ダブルチェック同期を使用してスレッドセーフな方法でシングルを遅延ロードしますhttps://stackoverflow.com/a/11165926/906362
private static SingletonDemo instance;
public static SingletonDemo get() {
if(instance == null) instance = getSync();
return instance;
}
private static synchronized SingletonDemo getSync() {
if(instance == null) instance = new SingletonDemo();
return instance;
}
private SingletonDemo(){
// here you can directly access the Application context calling
App.get();
}
元の答え
ドキュメントが示唆しているのは、通常のシングルトンパターンを使用することです
public class SingletonDemo {
private static SingletonDemo instance = null;
private SingletonDemo() { }
public static SingletonDemo getInstance() {
if (instance == null) {
instance = new SingletonDemo ();
}
return instance;
}
}
その中に次のようなメソッドを含めます。
private Context context;
init(Context context){
this.context = context.getApplicationContext();
}
シングルトンを初期化するためにこれを呼び出すことを忘れないでください。
アプリケーション アプローチとシングルトン アプローチの違いと、シングルトンの方が優れている理由については、ドキュメントを参照してください。same functionality in a more modular way