弱引用对象上的调用方法

时间:2018-11-09 16:15:40

标签: java android weak-references

我已经创建了一个静态变量来保存应用程序上下文,因为我打算在该类的其他地方使用它。该变量已在类的构造函数中分配,并且出现以下错误-“请勿将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);
}

如果不将变量设为弱引用,如何解决内存泄漏问题?或者,如果我做一个弱引用,我该如何执行它的方法?

2 个答案:

答案 0 :(得分:0)

您需要在get()上调用WeakReference<Context>方法以推断Context的值。

WeakReference<Context>没有getPackageManager()方法,这就是为什么出现此错误的原因。

答案 1 :(得分:0)

整个“上下文”确实使在Android中分层变得很困难。
在没有看到您尝试访问的类的情况下,很难确定,但是一个选择是使所有函数静态化,并使用其他类的上下文进行调用。您可以将上下文传递给静态函数并在其中使用它,只是不能将其保存为静态变量。例如:

static void doStuff(Context context){
//do context stuff
}
MyClass.doStuff(myCurrentClass.this);

如果将类实例化为对象,甚至根本不需要将全局上下文变量设为静态。