アプリケーション内に、パラメーターとしてContextを必要とするAndroid関数を呼び出す必要があるクラスがあります。このクラスはActivityクラスのサブクラスではないため、持っていません。
この問題に取り組む正しい方法は何ですか?
クラスの役割に依存します。しかし、とにかくApplicationContext
を渡しますが、アクティビティ1は渡しません。アクティビティコンテキストを渡すと、アクティビティが不要になったときにgcがメモリから削除できません。ただし、アプリケーションがOSによって終了されていないときにアプリケーションコンテキストが使用されます。Refer メモリリークの回避
パラメータとして渡します。または、さらに良いことに、アプリケーションコンテキストを取得してメモリリークを回避します。
public class Example {
protected Context context;
public Example(Context context){
this.context = context.getApplicationContext();
}
}
私はほとんどの場合、コンストラクターパラメーターアプローチを使用しています。インスタンス化で渡し、インスタンス化されたクラスでプライベート参照を保持します。
あなたは一つの重要なことを考えなければなりません。 Context
を渡すクラスがActivity
をインスタンス化するよりも長く存在する場合は、アプリケーションコンテキストを使用する必要があります。そのクラスがUIを行っている場合、アクティビティコンテキストが必要になります。
アクティビティコンテキストを渡すクラスがActivity
より長く続かないことを確認してください。そうしないと、アクティビティ全体がリークします。
UIを使用しない場合は、アプリケーションコンテキストを使用します。
私はそれをパラメーターとして渡します。
クラスのインスタンス化で渡し、保持します。
典型的な例の1つは、dbヘルパーを作成する場合です。こちらをご覧ください link
この質問に答えました here も。
ContextWrapper
、 ここで説明されているように を使用してそれを行うことができます。
例えば:
public class MyContextWrapper extends ContextWrapper {
public MyContextWrapper(Context base) {
super(base);
}
}
そのクラスをコンテキストとして使用します
最善の方法は、Beanアプローチに従うことです。
public class Example {
protected Context getContext() {
...
}
...
}
次に、コンテキストにアクセスする可能性に依存します。クラスが完全に独立している場合、コンストラクターパラメーターとプライベートフィールドが最適なアプローチのようです。
しかし、そのBeanプロパティの方法により、コードのさらなる変更から保護されます。