web-dev-qa-db-ja.com

非アクティビティクラスでコンテキストが必要

アプリケーション内に、パラメーターとしてContextを必要とするAndroid関数を呼び出す必要があるクラスがあります。このクラスはActivityクラスのサブクラスではないため、持っていません。

この問題に取り組む正しい方法は何ですか?

  1. 各呼び出しでパラメーターとして渡しますか?
  2. クラスのインスタンス化でそれを渡し、保持しますか?
45
theblitz

クラスの役割に依存します。しかし、とにかくApplicationContextを渡しますが、アクティビティ1は渡しません。アクティビティコンテキストを渡すと、アクティビティが不要になったときにgcがメモリから削除できません。ただし、アプリケーションがOSによって終了されていないときにアプリケーションコンテキストが使用されます。Refer メモリリークの回避

32
Maxim

パラメータとして渡します。または、さらに良いことに、アプリケーションコンテキストを取得してメモリリークを回避します。

public class Example {
    protected Context context;

    public Example(Context context){
        this.context = context.getApplicationContext();
    }
}
17
Mark Mooibroek

私はほとんどの場合、コンストラクターパラメーターアプローチを使用しています。インスタンス化で渡し、インスタンス化されたクラスでプライベート参照を保持します。

あなたは一つの重要なことを考えなければなりません。 Contextを渡すクラスがActivityをインスタンス化するよりも長く存在する場合は、アプリケーションコンテキストを使用する必要があります。そのクラスがUIを行っている場合、アクティビティコンテキストが必要になります。

アクティビティコンテキストを渡すクラスがActivityより長く続かないことを確認してください。そうしないと、アクティビティ全体がリークします。

UIを使用しない場合は、アプリケーションコンテキストを使用します。

10

私はそれをパラメーターとして渡します。

3
Aracem

クラスのインスタンス化で渡し、保持します。

典型的な例の1つは、dbヘルパーを作成する場合です。こちらをご覧ください link

3
ccheneson

この質問に答えました here も。

ContextWrapperここで説明されているように を使用してそれを行うことができます。

例えば:

public class MyContextWrapper extends ContextWrapper {

    public MyContextWrapper(Context base) {
      super(base);
   }

}

そのクラスをコンテキストとして使用します

2
ET-CS

最善の方法は、Beanアプローチに従うことです。

public class Example {
    protected Context getContext() {
        ...
    }

    ...
}

次に、コンテキストにアクセスする可能性に依存します。クラスが完全に独立している場合、コンストラクターパラメーターとプライベートフィールドが最適なアプローチのようです。

しかし、そのBeanプロパティの方法により、コードのさらなる変更から保護されます。

1
evilcroco