有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java静态上下文警告

Android Studio现在在类包含静态Context对象时显示警告。它说这会导致内存泄漏。然而,我注意到安卓库中也有这样的功能。例如,LocalBroacastManager类有一个静态实例,它包含一个context对象

那么这作为内存泄漏有多严重呢

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

没有context实例变量,如何实现这一点


共 (2) 个答案

  1. # 1 楼答案

    这大概是你能承受的最糟糕的情况了。假设您有一个活动,并将其存储为静态上下文。除非在活动结束时将其清空,否则您现在已经泄露了整个活动。这意味着活动持有的每个变量都会泄漏,包括整个视图层次结构。它基本上阻止了这种情况下的任何东西释放出来

    最好的做法不是存储上下文,而是将其作为参数传递给需要它的函数。如果必须存储上下文,请不要将其设置为静态。非静态变量不会泄漏它,只要在活动完成后框架中没有任何内容继续保留对对象的引用

    如果绝对必须使用静态上下文,请将其设置为应用程序上下文。这一条在你的应用程序中是有效的,所以它不会真的被泄露

  2. # 2 楼答案

    静态应该很少使用,尤其是在Android中。使用静力学有很多方法和原因,但在90%的情况下,这只是对静力学的滥用

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

    1. 你从活动A转到活动B
    2. 在活动B中,您将活动B引用作为静态上下文保存在某个地方
    3. 回到活动A。活动B应该被销毁,但它会被保留,因为您保留了对它的静态引用
    4. 现在你再次从A转到B,等等,你有两个B实例:一个是你看到的,另一个是作为静态上下文保存的

    你可能永远不会有两个相同活动的实例。这可能会引起很多问题

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

    如果你真的需要一个单例(不是单例模式(大写字母S)),而是某个类的单实例,如果你不想使用Dagger之类的库,你可以在你的应用程序类中实例化这个类,然后从你想要的任何地方引用它