首页 文章

静态上下文警告

提问于
浏览
0

当类包含静态 Context 对象时,Android Studio现在会显示警告 . 它说这会导致内存泄漏 . 但是,我注意到这也是在android库中完成的 . 例如, LocalBroacastManager 类有一个静态实例,它包含一个 context 对象 .

那么内存泄漏有多糟糕?

我有一个单独的地理围栏类,它在后台运行并保存 booleansharedPreferences ,指示用户是否在地理围栏中 . 为了保存首选项,我需要一个 context 对象,但由于该方法是一个重写方法,我无法传递上下文对象 .

如果没有 context 实例变量,怎么能实现呢?

2 回答

  • 2

    它是你可以拥有的最糟糕的 . 假设您有一个Activity,并将其存储为静态Context . 除非在活动结束时将其清空,否则您现在已泄露整个活动 . 这意味着活动所持有的每个变量都会泄露,包括整个视图层次结构 . 它基本上阻止了该上下文中的任何东西释放 .

    最好的办法是不存储Context,而是将其作为参数传递给需要它的函数 . 如果必须存储Context,请不要将其设置为静态 . 只要框架中的任何内容在活动结束后继续保持对对象的引用,非静态变量就不会泄漏它 .

    如果您绝对必须使用静态Context,请将其设置为Application上下文 . 那个在你的应用程序的长度上是有效的,所以它不能真正泄露 .

  • 1

    静态应该很少使用,特别是在Android中 . 有使用静力学的方式和原因,但在90%的情况下,它只是滥用它们 .

    将上下文保持为静态变量是一个很大的禁忌 . 想象一下以下场景:

    • 您从活动A转到活动B.

    • 在活动B中,您将活动B引用保留为某处的静态上下文 .

    • 你回到活动A.活动B应该被销毁,但是它被保留,因为你保留了它的静态引用 .

    • 现在你再次从A转到B,等等 - 你有两个B实例:你看到的那个和另一个作为静态背景保存的实例 .

    您可能永远不会有两个相同活动的实例 . 这可能会导致很多问题 .

    现在,我知道很多开发人员(甚至是制作库的人)时不时会犯错误并使用反模式,所以你不应该盲目地依赖别人的代码中看到的练习/模式 . 天哪,我甚至在谷歌开发者写的东西中看到了很多垃圾代码 .

    如果你真的需要一个单例(不是Singleton模式(大写S)),而是某个类的单个实例,如果你不想使用像Dagger这样的库,你可以在Application类中实例化那个类,然后引用它来自你想要的任何地方 .

相关问题