【问题标题】:Calling methods on a weak reference object在弱引用对象上调用方法
【发布时间】:2018-11-09 16:15:40
【问题描述】:

我创建了一个静态变量来保存应用程序上下文,因为我打算在课堂上的其他地方使用它。该变量在类的构造函数中被分配,我收到以下错误 - “不要将 Android 上下文类放在静态字段中(对 MyClass 的静态引用,其中的字段 appContext 指向 Context);这是内存泄漏(和也会破坏 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);
}

在我班上的某些地方我试图调用 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>

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

【问题讨论】:

    标签: java android weak-references


    【解决方案1】:

    您需要在WeakReference&lt;Context&gt; 上调用get() 方法以推断Context 值。

    WeakReference&lt;Context&gt; 没有 getPackageManager() 方法,这就是您收到该错误的原因。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 你完全误解了他想要达到的目的。而且你的建议很糟糕。 Android 中的Context 是一个super 对象,它有太多的权力,不应该在只需要它的一部分的地方传递。例如,如果您需要resources,只需传递resources 而不是整个context
      猜你喜欢
      • 2017-06-01
      • 1970-01-01
      • 2023-03-13
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多