Context了解一些就能防止内存泄漏

160 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

Android中的上下文是什么?

上下文字面意思是表述上下内容,它代表当前状态。关于使用Context的一些示例!

  • 应用程序的当前状态通过Context来表达。
  • Activity和Application的信息可以通过Context获取。
  • Resource、Database、SharedPreferences等系统资源可以通过Context获取。
  • Application 和 Activity 类都是扩展 Context 的子类。

在开发 Android 应用程序时,到处都可以轻松访问Context。因为它是 Android 应用程序开发中最重要的元素,所以理解和使用它很重要。不正确地使用 Context 会导致内存泄漏。\

我们以 Activity 为例,它是 Context 的子类,看一下发生内存泄漏的情况。

  • 在 ViewModel 等中将 Activity 引用为成员变量时。
  • 当在Activity中使用声明为非静态内部类的Handler时。
  • 当 (Text)View 被声明为静态变量并且 Activity 引用它时
  • 从 Singleton 引用 Activity 时

由于 Context 在 Android 中存在于各种类型中,因此可能会混淆何时-何地使用,以及正在进行哪个引用。但是我们一般只需要记住两个非常关键的。

  1. Application Context:这个Context就是Android应用本身,代表当前应用的状态。例如,假设存在扩展 Application 的 MyApplication 类,Application Context 是 MyApplication 的私有实例。
  2. Activity Context:这个Context也是一个Activity,代表一个Activity。如果有一个名为 MainActivity 的类,那么 Activity Context 就是 MainActivity 的一个专用实例。

Application Context

ApplicationContext是一个实例,可以通过Activity中的getApplicationContext()方法访问。此Context与Application的生命周期相关联。当需要的生命周期大于当前组件的周期时,使用ApplicationContext。

由于Application的范围大于Activity的范围,如果在Application内引用Activity,就会发生内存泄漏。Application开发中使用的许多库都需要上下文进行初始化,这就是为什么此时通常需要ApplicationContext而不是Activity的原因。

Activity Context

Activity的上下文是可以在Activity生命周期内使用的上下文,此上下文与 Activity 的生命周期相关联。仅当您需要在 Activity 范围内使用 Context 或具有附加到当前 Context 的生命周期的 Context 时,才应使用 Activity Context。

应该使用哪个上下文?

假设有 XXXXApplication,它扩展了 Application,还有几个 XXXActivity 类。此外,假设管理应用程序中的数据库的名为 AppDatabase 的类作为单例存在。AppDatabase 在初始化时可能需要一个上下文。此时我应该参考什么上下文?

答案是应用程序上下文。这是因为,假设传递了 Activity Context,显然 Activity 在其生命周期的某个时刻被销毁了,但 AppDatabase 是单例的,所以它继续引用 Activity Context 并导致内存泄漏。

此外,由于Application Context不支持Activity Context支持的所有内容,因此应用程序上下文可能无法对所有与 GUI 相关的事物正常工作。因此,无条件使用 Application Context 是不对的。例如,像 Dialog 这样的对象需要一个 Activity Context。