web-dev-qa-db-ja.com

Android:コンテキストへの参照とメモリリーク

Androidアプリケーションで、コンテキストへの長期間の参照を保持するのは間違いであり、メモリリークの原因であると読みました。

しかし、次のようなクラスを作成しても問題ないかどうかはわかりません。

public class HelperClass {
    private Context context;

    public HelperClass(Context context) {
        this.context = context;
    }
    public void myHelperMethod() {
        // uses this.context
    }
}

そして、アクティビティからそれを呼び出します:

public class MyActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        HelperClass h = new HelperClass(this);
        h.myHelperMethod();
    }

    ...
}
29
Guido

これは問題なく、メモリリークを引き起こすことはありません。

onCreateの実行が終了するとすぐに、hはスコープ外になり、ガベージコレクションの対象になります。 hが静的である場合、問題が発生します。コンテキストへの参照がコンテキスト自体のライフサイクルよりも長生きする場合にのみ、メモリリークが発生します。いくつかの役立つヒント:

  • 可能な場合はContext.getApplicationContext()を使用してください。このコンテキストは、アプリケーションが存続している限り存続します。
  • 静的フィールドと内部クラスを使用するときは注意してください。
  • プロファイラーを介してアプリケーションを実行します リークをチェックします。
45
dbyrne

HelperClassのスコープはonCreate関数内にのみあるため、onCreateが実行されると、「h」オブジェクトは不要になり、ガベージコレクションの対象になります。

「h」が静的メンバーである場合、それは別の話になります-それはメモリをリークするための素晴らしい方法です。

7
EboMike