コンストラクターに内部的に使用するアクティビティコンテキストをコンストラクターに渡す - これは悪いことです
-
04-10-2019 - |
質問
コンテキストをコンストラクターに渡して、内部使用のためのプライベート変数として保存するのは悪い習慣ですか?もう1つのオプションは、コンテキストをパラメーターとして、必要なメソッドに渡すことです。
どちらが良いオプションですか?コンストラクターに通うと、誤ってメモリリークが発生する可能性があると感じています。
解決
多くの場合、必要なのはです ApplicationContext
, 、だからあなたができることは合格することです this.getApplicationContext()
ただの代わりに this
. 。とにかく、アプリのコンテキストはアプリの寿命に存在するため、メモリリークではありません。
他のヒント
それはあなたのオブジェクトの生涯に依存します。オブジェクトがアクティビティによって内部的にのみ使用されることを確認している場合、コンテキストをコンストラクターに渡すことは問題ありません。そうでなければ、コンテキストを渡さないでください。
オブジェクトがコンテキストに参照されている場合、これにより、アクティビティが収集されるアクティビティが停止します。アクティビティにはすべてのビューへの参照があるため、これは非常に迅速に多くのメモリを簡単に漏らすことができます。
デバイスのローテーションのようなものがアクティビティを再作成するため、ここで自分自身を捕まえるのは簡単で、気付かずにオブジェクトに固執するのは簡単です。
したがって、おそらく安全な側にいて、必要なときにコンテキストを通過することが最善です。
メインアプリケーション(起動)では、変数AppContextを宣言します。次に、このメインアプリケーションのOnCreate()メソッドで、「AppContext = this;」を割り当てます。 AppContextは公開されているため、このパッケージの他のクラスはAppContextを使用してXMLリソースを追跡できます。これは(メモリの観点から)より良いですか?
さらに良いかもしれませんが、リソースオブジェクトをメインアプリケーションでpublic staticとして宣言し、リソースが必要なすべてであるため、他の場所で使用することです。