私のアクティビティは、パラメータとしてコンテキストを必要とする AlertDialog を作成しようとしています。以下を使用すると、期待どおりに動作します。
AlertDialog.Builder builder = new AlertDialog.Builder(this);
しかし、画面の回転のような単純な動作の最中でもアクティビティが破棄され再作成されるとメモリリークが発生する可能性があるため、「this」をコンテキストとして使用することには慎重です。Android開発者ブログの関連記事:
コンテキスト関連のメモリ リークを回避する簡単な方法が 2 つあります。最も明白な方法は、コンテキストをそのスコープ外にエスケープしないようにすることです。上記の例では静的参照の場合を示しましたが、内部クラスと外部クラスへの暗黙的な参照も同様に危険です。2 つ目の解決策は、アプリケーション コンテキストを使用することです。このコンテキストは、アプリケーションが存続する限り存続し、アクティビティのライフ サイクルに依存しません。コンテキストを必要とする長期存続オブジェクトを保持する予定の場合は、アプリケーション オブジェクトを忘れないでください。Context.getApplicationContext() または Activity.getApplication() を呼び出すことで簡単に取得できます。
しかし、 または がない場合は、AlertDialog()
例外がスローされるため、コンテキストとして受け入れられます。getApplicationContext()
getApplication()
「ウィンドウを追加できません - トークン null はアプリケーション用ではありません」
Activity.getApplication()
公式には使用を推奨されているにもかかわらず、宣伝どおりに機能しないので、これは本当に「バグ」とみなすべきなのでしょうか?
ジム
ベストアンサー1
の代わりにgetApplicationContext()
を使用してくださいActivityName.this
。