【问题标题】:App crashes because of "context" issue由于“上下文”问题,应用程序崩溃
【发布时间】:2017-06-06 06:51:34
【问题描述】:

我对 android 还很陌生,在掌握 Contexts 的概念时遇到了问题。

我有一个包含 3 个活动的小应用:

1- 主要活动

2- 登录活动

3- 飞溅活动

我创建了许多属于 MainActivity 的类并作为它的一部分运行。其中一个类是数据库助手。数据库助手需要一个上下文来使用,而我所做的是,在 MainActivity:

public static Context context;

在 onResume 中我会这样做:

@Override
public void onResume() {
    super.onResume();

    this.context = this;
}

所有活动都正常,spalsh 正常,登录正常,一切正常。我已经在 Manifest 中定义了所有内容。

但是当我让我的应用程序在后台运行一段时间并用我的手机做其他事情并打开它时,有时它只是崩溃指向一个以“上下文”作为参数的函数。

有什么办法可以解决这个问题吗?

谢谢

【问题讨论】:

  • 显示异常,它是 styacktrace
  • 我认为您的上下文不应该是静态的,它会根据活动和所有内容进行更改,因此最好为每个活动创建单独的上下文,这应该可以解决您的问题。
  • 请勿泄露活动上下文

标签: java android android-context


【解决方案1】:

应用程序崩溃,因为您仅使用“this”关键字来分配引用。 “this”关键字指向当前对象。在后台应用时,“this”可以引用另一个对象。因此,为了避免崩溃,将关键字“this”与“MainActivity.this”之类的活动名称绑定,其中 MainActivity 是您当前的活动名称。

【讨论】:

    【解决方案2】:

    避免对 Context 进行静态引用,因为它们可能导致内存泄漏,您可以阅读此blog article 来了解它。 由于活动本身就是一个上下文,您可以使用ActivityName.this 将其传递给其他类。

    【讨论】:

      【解决方案3】:

      发生这种情况是因为调用该后台任务的活动在崩溃时不存在。所以你需要在那里使用Application Context。

      简单的方法是

      @Override
      public void onResume() {
          super.onResume();
      
          this.context = this.getApplicationContext();
      }
      

      是的,您定义的上下文 (public static Context context;) 不应该是静态的。 (虽然这不会给您带来问题,但最佳做法是不要将 Context 设为静态。)


      您应该阅读What is 'Context' on Android?App crashes because of "context" issue

      【讨论】:

        【解决方案4】:

        使用 ActivityName.this 替换上下文。您的问题将得到解决。

        【讨论】:

        • 如果他使用了ino onresume,this和ActivityName.this有什么不同?
        • 我试过使用 MainActivity.this 但我收到错误:错误:(25、31)错误:不是封闭类:MainActivity 我也不知道如何解决这个问题...... .有什么帮助吗?
        • 我能理解,问一个问题会让你生气,这个小组投票不会持续很长时间:)
        • 另外,为什么将上下文设为静态是个坏主意?
        • @Arn 阅读接受的答案stackoverflow.com/questions/10258507/…
        猜你喜欢
        • 1970-01-01
        • 2018-08-04
        • 1970-01-01
        • 1970-01-01
        • 2021-04-20
        • 2016-04-06
        • 2020-05-29
        • 2017-03-13
        • 2012-06-19
        相关资源
        最近更新 更多