私のアクティビティは、パラメータとしてコンテキストを必要とするAlertDialogを作成しようとしています。私が使用する場合、これは期待どおりに機能します:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
ただし、アクティビティが破棄されて画面の回転などの単純なものである場合でもメモリリークが発生する可能性があるため、「this」をコンテキストとして使用することはお勧めしません。Android開発者のブログの関連記事から:
コンテキスト関連のメモリリークを回避する簡単な方法が2つあります。最も明白なのは、コンテキストが自身のスコープ外にエスケープされないようにすることです。上記の例では、静的参照の場合を示しましたが、内部クラスとそれらの外部クラスへの暗黙的な参照も同様に危険です。2番目のソリューションは、アプリケーションコンテキストを使用することです。このコンテキストは、アプリケーションが有効であり、アクティビティのライフサイクルに依存しない限り有効です。コンテキストを必要とする長期間存続するオブジェクトを保持する予定の場合は、アプリケーションオブジェクトを覚えておいてください。Context.getApplicationContext()またはActivity.getApplication()を呼び出すことで簡単に取得できます。
しかし、のためにAlertDialog()
どちらgetApplicationContext()
かgetApplication()
に例外をスローするように、コンテキストとして許容可能です:
「ウィンドウを追加できません—トークンnullはアプリケーション用ではありません」
正式に使用することActivity.getApplication()
をお勧めしますが、宣伝どおりに機能しないため、これは本当に「バグ」と考える必要がありますか?
ジム