我是否真的需要将Context实例深入到应用程序中?

时间:2012-11-08 21:46:00

标签: android architecture android-activity android-context

在应用程序的某个地方,我需要使用getString方法获取一个本地化字符串以显示错误消息。为此,我需要一个Context实例,例如来自一个Activity。这真的是这个设计的吗?我是否真的被迫将这些对象传递给类和方法,或者我是否忽略了这一点,是否有其他方法来获取字符串引用?

为了澄清,在一个Activity中,我有一个内部AsyncTask子类,在doInBackground中实例化一个新类,用于UI线程之外的一些短网络处理。我希望错误消息被本地化,为此我需要将Context实例(换句话说,Activity)传递到该类中。从XML文件中获取价值资源的设计似乎有点不直观。它让我想知道为什么它与Context实例结合在一起而不是静态的东西或者 - 请原谅我 - 一个单例,因为Context意味着它是全局应用程序上下文而不仅仅是一个Activity的一部分。

2 个答案:

答案 0 :(得分:7)

不,你不应该这样做。一个简单的规则是;如果您需要的上下文是触摸UI或仅与活动类的内部相关联,那么您应该使用活动上下文。即便如此,重要的是对上下文的任何引用都没有比活动更大的生命周期。

不遵循这一点的重大危险是,您将对活动上下文的引用传递到代码中更深处的某个位置,并且您的活动被销毁,而您所持有的引用仍在范围内。您刚刚泄露了您的活动以及它所引用的所有内容。我建议不要将活动上下文传递到活动之外,除非真正必要,即使这样,也要确保控制生命时间。

因此,对于与UI无关的内容需要上下文,例如需要获取字符串资源,然后使用应用程序上下文。在活动中,以及在活动中声明字符串引用的地方,然后使用活动上下文是可以接受的,并且在我看来,首选,因为您正在有意识地决定范围和生命时间。

那就是说,你应该问一下这种特殊方法是否更适合放在一项活动中。它可能不是,但要问问自己。

最后,一个小小的迂腐点。您不会在任何地方传递对象。传递引用,实际上是对象引用的值。 Java中的所有内容都按值传递。

答案 1 :(得分:0)

您可以随时扩展应用程序类。在那里为getInstace()创建一个静态方法来获取上下文。