AndroidでgetApplicationContext()を使用すると、メモリリークを回避できますか?

       まず、アクティビティのコンテキストとアプリケーションのコンテキストはまったく同じではありません.1つは現在のアクティビティのコンテキストであり、そのライフサイクルはこのアクティビティに限定され、もう1つは全体のコンテキストです次のコードに示すように、アプリケーションとそのライフサイクルはプログラム全体に付随します。コンテキストの特性を悪用すると、メモリリークが発生することがよくあります。

public class TestContext{

    private static TestContext testContext;

    private Context context;


    private TestContext(Context context){

        this.context = context;

    }


    public static synchronized TestContext getInstance(Context context){

        if(null == testContext)

            testContext = new TestContext(context);

        return testContext;

    }

}

        明らかに、上記のシングルトンモードのtextContextは強力な参照静的型であり、そのライフサイクルはアプリケーション全体に付随することがよくありますが、渡すContextがアクティビティである場合、アプリケーションがまだ存続している限り、方法はありません。正常に動作するために。リサイクルすると、メモリリークが発生します。

        解決策は非常に簡単です。アプリケーションのコンテキストはこのメソッドによって取得されるため、TestContextを初期化して渡されたパラメーターコンテキストをcontext.getApplicationContext()に変更します。これにより、メモリリークについて心配する必要がなくなります。

        その場合、コンテキストを使用できるcontext.getApplicationContext()を誰もが喜んで置き換えませんか?残念ながら、これは不可能です。これらはまったく同じではなく、アプリケーションシナリオが異なり、すべてのアクティビティコンテキストシナリオではなく、アプリケーションコンテキストを引き続き使用できます。要約した表は、それらの間のアプリケーションシナリオを示しています。
https://pic3.zhimg.com/4c9656d1d4fa7556651829ba741df232_b.png



実際、私たちは2つの原則を把握する必要があるだけです。

1.UIに関連するものにアプリケーションのコンテキストを使用することはお勧めしません。

2.ライフサイクルが長いオブジェクトにアクティビティコンテキストを参照させないでください。つまり、アクティビティを参照するオブジェクトがアクティビティ自体と同じライフサイクルを持っている必要があります。そうでない場合は、を使用できるかどうかを検討してください。アプリケーションコンテキスト。

転載元:http://www.zhihu.com/question/34007989/answer/58296467 

おすすめ

転載: blog.csdn.net/weixin_42602900/article/details/123084556