当前位置: 首页 > 知识库问答 >
问题:

在弱引用对象上调用方法

罗昕
2023-03-14

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

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

共有2个答案

柳越
2023-03-14

整个“上下文”的事情真的很难在Android系统中进行分层。
如果看不到你试图访问的类,很难说是肯定的,但是一个选择是让所有的函数都是静态的,并用其他类的上下文调用它们。你可以把上下文传递给一个静态函数,并在其中使用它,你只是不能把它保存到静态变量中。例如:

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

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

柯河
2023-03-14

您需要调用WeakReference上的get()方法

WeakReference

 类似资料:
  • 问题内容: 我收到以下错误 尝试在空对象引用上调用虚拟方法’void android.widget.StackView.setAdapter(android.widget.Adapter)’ 在这条线上 完整的片段 EventsFragment.java 是 Stack_Adapter.java Stack_Items 问题答案: 您正在执行: 你是。返回。 你为什么用? 在哪里?您应该从正确的x

  • 我在使用 firebase firestore 时收到一个空指针引用,我的应用崩溃了。这是我的代码: 这里的sem指的是我的文档17030121084中的字段。 有人能对此提出解决方案吗?

  • 我的应用程序有问题,想解决它,但我无法访问解决方案,请帮帮我,,

  • 问题内容: 我在调用 非静态 方法时感到困惑 我知道 method-1 和 method-2 都将调用 doThis() ,但是功能上有什么区别吗? 问题答案: 功能上有区别吗? 两者的行为方式相同。 第二个选项不允许您再次重用该实例。在单行return语句中可能很方便和简洁(例如,请考虑使用构建器模式,其中每个构造方法都将返回一个半初始化的实例): 或者创建一个对象仅执行一次定义的操作。 方法2

  • 问题内容: 我尝试使用片段来打开数据库,但是,当我单击按钮开始搜索时,程序意外终止,并显示如下错误: 主片段: DBManager类: 顺便说一句,我在MainAcitivity中使用了有关DBManager的代码,并且成功了。将代码复制到上面的片段后,它失败了,该怎么办? 问题答案: 之前和之后你都做不到。 因为,您正在执行片段实例化时。该方法将始终返回null。另外,尽量不要将参考文献保留在您

  • 问题内容: 我正在尝试将播放器的名称保存为共享的首选项,并通过再次以共享的首选项获取它的名称来使其显示在另一个活动中,但是我的应用程序崩溃了。 致命异常:主要 代码: 播放器 PlayGame.java PlayerName.java 问题答案: 您的应用在以下位置崩溃: 因为。 您忘记在PlayGame活动中进行初始化。