2017-02-10 3 views
1

下記のコードを確認してください UtilsクラスのWeakReferencesをコンテキストメモリのリークを処理するために使用できますか?Android WeakReferenceがメモリリークを処理する

コンストラクタで
private static final String TAG = "Utils"; 
private static Utils instance; 
private Context context; 

public Utils(WeakReference<Context> context) { 
    this.context = context.get(); 
} 

public static synchronized final Utils getInstance(Context context) { 
    if (instance == null) { 
     instance = new Utils(new WeakReference<Context>(context)); 
    } 
    return instance; 
} 
+0

コンテキストへの参照を保持したい場合は、 'context.getApplicationContext()'を使用してください。これは、アプリケーションが実行されている限り、メモリリークを作成しません。 –

答えて

0

いいえ、WeakReferenceはいつでもnullを返すので、このような無意味なものになります。

WeakReferenceにアクセスするたびにWeakReferenceをチェックしてから、メソッドの引数にコンテキストを指定することで対処する必要があるため、フィールドにコンテキストを保存する必要はありません。

ApplicationContext(context.getApplicationContext())を使用するのが最も良い解決策ですが、最良の方法は、すべてのメソッド呼び出しにコンテキストを渡すことです。

0

private WeakReference<Context> context;

:(あなたはシングルトンクラスを作成しようとしている場合、それはプライベート作る)

this.context = context;

他のすべては、ISよさそうです。

0

Leak Canaryを使用してメモリリークをチェックできます。同じことをしますが、コードは1行だけです。それはあなたにすべてのメモリリークの根本を伝えます。

+0

このツールを使用して、Utilsクラスが3 MBのメモリをリークしていることを知りました。だから私は問題を解決するために探しています。 – Jarvis

+0

'Context'をどこでも' static'として宣言したり、 'Context'を' static'としてコンストラクタに入れた 'Class'を宣言しないでください。 –

関連する問題