【问题标题】:Pass Application Context to the view instead of Activity Context将应用程序上下文而不是活动上下文传递给视图
【发布时间】:2012-12-29 07:33:28
【问题描述】:

为什么要使用 Activity Context 而我们可以使用 Application Context 来加载和访问资源?意味着如果我使用 Application Context 而不是 Activity Context 不会发生异常,那么为什么要使用 Activity Context

示例:

在下面的示例中,如果我在活动 onCreate() 中使用 getApplicationContext() 而不是“this”指针,它可以正常工作而无需任何例外。

 Button button = new Button(getApplicationContext());

【问题讨论】:

标签: android android-context


【解决方案1】:

getApplicationContext() 应该与view 一起使用,这将具有 Activity 之外的范围(例如,当您从 Activity 绑定到服务时)。

但是要像上面提到的那样定义视图(定义按钮),您绝对应该使用Activity's ContextMyActivity.this 或简单的this)。

原因是如果您使用getApplicationContext(),它的寿命将与整个应用程序的寿命一样长。但是对于一个 Button,它应该在 Activity 完成后立即销毁,因此在定义此类 Views 时,最好使用 this(Activity's Context)。

如果我使用应用程序上下文而不是活动上下文,则没有 例外

也不例外,因为两者都是有效的上下文。如果您在整个应用程序生命周期内保持视图处于活动状态,即使它不需要(这最终会导致内存泄漏),或者您想在 Activity 完成后立即销毁它,这取决于您。

【讨论】:

  • 我看不出将应用上下文传递给视图的构造函数如何将其生命周期延长到活动之外。视图持有应用程序上下文引用,而不是相反,所以一旦持有所述视图的膨胀布局被销毁,除非你有另一个句柄,否则该视图也应该准备好进行 GC。
【解决方案2】:

它们都是 Context 的实例,但应用程序实例与应用程序的生命周期相关联,而 Activity 实例与 Activity 的生命周期相关联。因此,他们可以访问有关应用程序环境的不同信息。

如果您阅读 getApplicationContext 上的文档,它会指出,只有在需要生命周期与当前上下文分开的上下文时才应该使用它。这不适用于您的任何一个示例。

Activity 上下文大概有一些关于当前活动的信息,这些信息是完成这些调用所必需的。如果您显示确切的错误消息,也许能够指出它究竟需要什么。

但一般来说,除非您有充分的理由不这样做,否则请使用活动上下文。

【讨论】:

    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    相关资源
    最近更新 更多