java静态上下文警告
Android Studio现在在类包含静态Context
对象时显示警告。它说这会导致内存泄漏。然而,我注意到安卓库中也有这样的功能。例如,LocalBroacastManager
类有一个静态实例,它包含一个context
对象
那么这作为内存泄漏有多严重呢
我有一个在后台运行的单例地理围栏类,它保存一个boolean
到sharedPreferences
的值,指示用户是否在地理围栏中。为了保存首选项,我需要一个context
对象,但是由于该方法是一个被重写的方法,因此我无法在其中传递上下文对象
没有context
实例变量,如何实现这一点
# 1 楼答案
这大概是你能承受的最糟糕的情况了。假设您有一个活动,并将其存储为静态上下文。除非在活动结束时将其清空,否则您现在已经泄露了整个活动。这意味着活动持有的每个变量都会泄漏,包括整个视图层次结构。它基本上阻止了这种情况下的任何东西释放出来
最好的做法不是存储上下文,而是将其作为参数传递给需要它的函数。如果必须存储上下文,请不要将其设置为静态。非静态变量不会泄漏它,只要在活动完成后框架中没有任何内容继续保留对对象的引用
如果绝对必须使用静态上下文,请将其设置为应用程序上下文。这一条在你的应用程序中是有效的,所以它不会真的被泄露
# 2 楼答案
静态应该很少使用,尤其是在Android中。使用静力学有很多方法和原因,但在90%的情况下,这只是对静力学的滥用
将上下文保持为静态变量是一个很大的禁忌。想象一下以下场景:
你可能永远不会有两个相同活动的实例。这可能会引起很多问题
现在,我知道很多开发人员(甚至是那些制作库的开发人员)时不时会犯错误并使用反模式,所以你不应该盲目地依赖别人代码中的实践/模式。见鬼,我甚至在谷歌开发者写的东西中看到了很多垃圾代码
如果你真的需要一个单例(不是单例模式(大写字母S)),而是某个类的单实例,如果你不想使用Dagger之类的库,你可以在你的应用程序类中实例化这个类,然后从你想要的任何地方引用它