0

在 Android 编程中,几乎所有地方都传递的最常用的参数是Context. 我们知道它的用途。但是我们不知道为什么我们应该出于这些目的传递它,以及为什么不从全局静态位置访问它。

根据 Uncle Bob 的 Clean Code,获得更简洁代码的一种方法是减少参数,使它们对您正在执行的任务更有意义。基于此,并基于 DRYing 参数,我们决定试一试,并创建一个功能齐全的应用程序,该应用程序具有活动、片段、前台和后台服务、通知、媒体等,并使用许多设备 API,如相机、 GPS等是一个真实世界的应用程序,并且在应用程序创建时只有一个静态上下文初始化。

因此,在应用程序创建中我们创建了一个public static Context context变量,并使用override中getApplicationContext()的方法对其进行了初始化。onCreate()

然后,我们没有在整个代码中传递诸如this、等上下文,而是简单地使用了 ,并且我们没有将它作为构造函数参数传递给我们的适配器和其他实用程序函数。getContextApp.context

现在,在冒险进行了这一大胆的运动之后,我们认为我们的应用程序没有任何问题。一切正常,电池消耗没有改变,至少它对我们来说是不可测量的,所以它非常低。内存消耗没有改变,我们无法衡量它。应用程序性能和速度没有明显改变。

所以我们有一个非常大的问题,我们的方法有什么缺点?为什么 Android 开发人员不只是公开一个可以初始化的全局上下文并从整个生态系统中删除所有上下文参数,而是只在需要时访问该全局变量?

4

3 回答 3

1

请仔细阅读博客,您将更好地了解 Context。

在类的全局范围内定义的静态变量,因此它们也被称为类成员。

  1. 您无法控制静态变量的创建和销毁。有用的是,它们在程序加载时创建并在程序卸载时销毁。
  2. 由于静态变量是类成员,因此必须管理所有尝试访问它们的线程。
  3. 如果一个线程更改静态变量的值,可能会破坏其他线程的功能。
于 2018-07-20T08:49:18.613 回答
0

您的应用程序不会因为您使用应用程序上下文而中断:这可能不是最佳实践,但通常没问题。

您缺少的是 Context 是一个抽象类,具有许多不同的实现(Activity 是 Context,Service 是 Context,Application 是 Context)具有不同的属性和功能。Activity 有一个与之关联的完整图形上下文和一个完整的视图层次结构,可以在内存中占用兆字节。

一个常见的错误(我早期自己犯过的)是将 Activity 存储在静态字段中:这会导致内存泄漏,因为一旦用户将应用程序置于后台,Activity 就会到达onDestroy(...)回调,用户再次打开应用程序。

于 2018-07-20T09:07:43.120 回答
0

在我的项目中,我将静态应用程序上下文用于除图形之外的所有内容。事实上,应用程序上下文不包含有关样式的信息,如果您基于它创建小部件,那么它将具有默认样式。

在这一刻,我从未遇到过这种方法的问题。重要的是,我不会为我的项目编写测试。但我确信这不会是一个问题。

如果您指出这种使用上下文的问题,我也将非常感激。(测试除外)

于 2018-07-20T08:09:14.980 回答