我已经创建了一个静态变量来保存应用程序上下文,因为我打算在该类的其他地方使用它。该变量已在类的构造函数中分配,并且出现以下错误-“请勿将Android上下文类放在静态字段(对MyClass的静态引用中,其中的appContext指向Context的字段);这是内存泄漏(并且也会中断即时运行)[StaticFieldLeak]“
下面是MyClass中的代码:
'MAX(IF(key = "'+key+'", value, NULL)) as ['+key+']'
->
CONCAT('MAX(IF(key = "',key,'", value, NULL)) as [',key,']')
要解决此问题,我考虑过将appContext作为弱引用变量。但是我无法在该变量上调用任何方法,因为它的引用很弱。下面是更新的代码以及尝试在弱对象上调用方法时遇到的错误。
更新的代码:
private static Context appContext;
public MyClass(Context context) {
appContext = context;
}
在我班上的某些地方,我试图调用appContext.getPackageManager()和appContext.getString(),但看到以下错误:
private final WeakReference<Context> appContext;
public MyClass(Context context) {
appContext = new WeakReference<Context>(context);
}
如果不将变量设为弱引用,如何解决内存泄漏问题?或者,如果我做一个弱引用,我该如何执行它的方法?
答案 0 :(得分:0)
您需要在get()
上调用WeakReference<Context>
方法以推断Context
的值。
WeakReference<Context>
没有getPackageManager()
方法,这就是为什么出现此错误的原因。
答案 1 :(得分:0)
整个“上下文”确实使在Android中分层变得很困难。
在没有看到您尝试访问的类的情况下,很难确定,但是一个选择是使所有函数静态化,并使用其他类的上下文进行调用。您可以将上下文传递给静态函数并在其中使用它,只是不能将其保存为静态变量。例如:
static void doStuff(Context context){
//do context stuff
}
MyClass.doStuff(myCurrentClass.this);
如果将类实例化为对象,甚至根本不需要将全局上下文变量设为静态。