34

Context への長期間の参照を保持することは間違いであり、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();
    }

    ...
}
4

2 に答える 2

51

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

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

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

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

「h」が静的メンバーである場合は別の話になります。これは、メモリをリークするための優れた方法です。

于 2010-07-27T17:20:44.170 に答える