繁体   English   中英

弱引用对象上的调用方法

[英]Calling methods on a weak reference object

我创建了一个静态变量来保存应用程序上下文,因为我打算在该类的其他地方使用它。 该变量已在类的构造函数中分配,并且出现以下错误-“请勿将Android上下文类放在静态字段(对MyClass的静态引用中,其中的appContext指向Context的字段);这是内存泄漏(并且也会中断即时运行)[StaticFieldLeak]“

以下是MyClass中的代码:

private static Context appContext;
public MyClass(Context context) {
   appContext = context;
}

为了解决此问题,我想到了将appContext作为弱引用变量。 但是我无法在该变量上调用任何方法,因为它的引用很弱。 以下是更新的代码以及尝试在弱对象上调用方法时遇到的错误。

更新的代码:

private final WeakReference<Context> appContext;
public MyClass(Context context) {
   appContext = new WeakReference<Context>(context);
}

在我班上的某些地方,我试图调用appContext.getPackageManager()和appContext.getString(),但看到以下错误:

error: cannot find symbol
symbol:   method getPackageManager()
location: variable appContext of type WeakReference<Context>

error: cannot find symbol
symbol:   method getString(int)
location: variable appContext of type WeakReference<Context>

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM