2016-04-23 7 views
3

私は、アプリケーションの共有設定を扱うクラスを構築しています。私は、プロジェクトのすべての部分からシングルトンにアクセスしたいと思っています。クラスが機能するためにコンテキストを渡す必要があるため、通常のgetInstanceメソッドを使用することはできません。私はMainActivity.javaでコンテキストを渡すことを考えていました。メモリリークがありますか?コンテキストとしてのシングルトンが変数として - メモリリーク?

これが私の現在のソリューションです:あなたが唯一のgetApplicationContext()を呼び出すことにより、アプリケーションコンテキストへの参照を維持しているので、あなたは、リークを作成しません

public class LocalStorage { 

    private Context context; 

    private static LocalStorage instance = null; 

    protected LocalStorage() { 
     // Exists only to defeat instantiation. 
    } 

    public static LocalStorage getInstance() { 
     if(instance == null) { 
      instance = new LocalStorage(); 
     } 
     return instance; 
    } 

    public static LocalStorage getInstance(Context _context) { 
     LocalStorage localStorage = getInstance(); 
     localStorage.context = _context.getApplicationContext(); 
     return localStorage; 
    } 

    private SharedPreferences sharedPreferences() { 
     return context.getSharedPreferences("mySettings", Context.MODE_PRIVATE); 
    } 
.... 

答えて

8

_contextを直接参照し、その参照がActivityまたはその他のContextであった場合は、メモリリークが発生しています。

ここでのシングルトンの実装は少し奇妙です。私は、コンストラクタにContextに渡すことで、不要な余分なgetInstance()を削除するには、次のをお勧めします:

public class LocalStorage { 
    private static LocalStorage instance = null; 

    private Context context; 

    private LocalStorage(Context context) { 
     this.context = context; 
    } 

    public synchronized static LocalStorage getInstance(Context context) { 
     if(instance == null) { 
      instance = new LocalStorage(context.getApplicationContext()); 
     } 

     return instance; 
    } 

    private SharedPreferences sharedPreferences() { 
     return context.getSharedPreferences("mySettings", Context.MODE_PRIVATE); 
    } 
    .... 
+0

ありがとうございました。コードサンプルに関して、これは私がいつもgetInstanceでコンテキストを提供する必要があることを意味します。私は一度だけそれをしたい。 – Guy

+0

私は参照してください。問題が一度しか起こらない場合は、 'Context'を与えない他の' getInstance() '呼び出しの前にコードが最初に実行されることを保証しなければなりません。そうでないと、' Context'なしでシングルトンを初期化します。それはエラーが起こりやすい。あなたが必要とするときはいつも、 'Context'にアクセスするのは一般的に問題ではありません。特にアプリケーションのコンテキスト。 –

+0

アプリケーションクラスのonCreateメソッドでシングルトンのコンテキストを設定する方法はありますか?それは常に最初に実行されませんか?そうする際に注意すべき点はありますか? – Guy

関連する問題