2016-09-29 8 views
0

クラスに静的なContextオブジェクトが含まれている場合、Androidスタジオで警告が表示されるようになりました。これは、メモリリークを引き起こすと言います。しかし、私はこれもアンドロイドのライブラリで行われていることに気づいた。たとえば、LocalBroacastManagerクラスには静的インスタンスがあり、それにはcontextオブジェクトが含まれています。静的コンテキスト警告

これはメモリリークとしてどの程度悪いですか?

私は、バックグラウンドで実行されるシングルトンジオフェンシングクラスを持っていて、ユーザがジオフェンスにいるかどうかを示すbooleansharedPreferencesを保存します。環境設定を保存するには、contextオブジェクトが必要ですが、メソッドがオーバーライドされたメソッドなので、コンテキストオブジェクトを渡す方法がありません。contextインスタンス変数を使用しないと、どうしてこれを実現できますか?

答えて

2

これは最悪の場合です。アクティビティがあり、それを静的コンテキストとして格納するとします。アクティビティーが終了したときにそれをヌルにしない限り、アクティビティー全体がリークしました。つまり、ビュー階層全体を含め、アクティビティーが保持するすべての変数がリークします。基本的に、そのコンテキスト内の何かが解放されないようにします。

コンテキストを保存するのではなく、そのコンテキストを必要とする関数にパラメータとして渡すことをお勧めします。コンテキストを保存する必要がある場合は、静的にしないでください。非静的変数は、アクティビティが終了した後でもフレームワーク内の何もオブジェクトへの参照を保持しない限り、それをリークしません。

静的コンテキストを絶対に使用する必要がある場合は、アプリケーションコンテキストにします。それはあなたのアプリの長さにわたって有効なので、本当に漏れることはありません。

1

統計情報は、特にAndroidではほとんど使用しないでください。静的使用の方法と理由がありますが、90%のケースでは、それらを誤用するだけです。

コンテキストを静的変数として保持することは大きな問題ではありません。活動Bにあなたがどこかに静的なコンテキストとして活動Bの参照を保持しながら、活動B.

  • に活動Aから行く

    1. :次のシナリオを想像してみてください。
    2. アクティビティAに戻ります。アクティビティBは、静的な参照を保持しているので、破棄する必要がありますが、保持されます。
    3. 今度は、A、et voilaからBに行きます。あなたは2つのBインスタンスを持っています。あなたが見るものと静的コンテキストとして保持されているものです。

    同じアクティビティのインスタンスが2つあることは絶対にありません。それは多くの問題を引き起こす可能性があります。

    今では、多くの開発者(ライブラリを作る人さえも)が間違いを覚え、アンチパターンを使用していることを知っていますので、他人のコードに見られる練習/パターンに盲目的に頼るべきではありません。地獄、私はGoogle devsによって書かれたものにたくさんのゴミコードを見たことがあります。

    Daggerなどのライブラリを使用したくない場合は、実際にシングルトン(シングルトンパターン(大文字のS)ではなく)が必要な場合は、そのクラスをインスタンス化できますどこからでも参照できます。

  • +0

    実際、ほとんどの人は、アプリケーションオブジェクトをシングルトンホルダーとして見つけ出しています。それは静的なものを使用することより利点を与えません。シングルトンを作成するためにスタティックを使用することに問題はありませんが、それはコンテキストを保持するために使用すべきではありません。 –

    +0

    objetsを静的として保存し、そのようにアクセスすることは、共有状態を持つことを意味します。また、シングルトンパターンで作成された古いシングルトンは継承されず拡張されませんでした。クラスのインスタンスを1つしか必要としない場合は、インスタンスを1つだけ作成し、IoCを使用すると必要な場所で利用できるようにします。私はなぜそれが時代主義であるのか分かりません。アプリケーションクラスは、クラス/依存関係ツリーの中で一重項であり、一番上のクラスです。単純なJavaアプリケーションでmain()メソッドを保持するクラスのようなものですが、ssingleton 。 – SadClown