静态上下文警告

时间:2016-09-29 14:54:39

标签: java android performance android-studio memory-leaks

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

那么内存泄漏有多糟糕?

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

如果没有context实例变量,如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

  1. 您从活动A转到活动B.
  2. 在活动B中,您将活动B引用保留为静态上下文。
  3. 你回到活动A.活动B应该被销毁,但是保留它,因为你保留了静态引用。
  4. 现在你再来一次来自A,等等 - 你有两个B实例:你看到的那个和另一个作为静态背景的实例。
  5. 您可能永远不会有两个相同活动的实例。这可能会导致很多问题。

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

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