在弱引用对象上调用方法

Calling methods on a weak reference object

我创建了一个静态变量来保存应用上下文,因为我打算在 class 的其他地方使用它。这个变量在 class 的构造函数中被赋值,我收到以下错误 - "Do not place Android context classes in static fields (static reference to MyClass which has field appContext pointing to Context); this is a memory leak (and also breaks Instant Run) [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);
}

在我的 class 中的某些地方,我试图调用 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() 方法,这就是您收到该错误的原因。

整个 "context" 事情真的让 Android 中的分层变得困难。
在没有看到您尝试访问的 class 的情况下,很难确定,但一种选择是将所有函数设为静态并使用其他 classes 的上下文调用它们。您可以将上下文传递给静态函数并在其中使用它,只是不能将其保存到静态变量中。例如:

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

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