13

在应用程序的某个地方,我需要使用 getString 方法获取本地化字符串以获取错误消息。为此,我需要一个 Context 实例,例如从一个 Activity 中获取。这真的是这样设计的吗?我真的被迫将这些对象传递到类和方法中,还是我错过了重点,还有其他方法可以获得字符串引用吗?

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

4

2 回答 2

7

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

不遵循这一点的最大危险是您将对活动上下文的引用传递到代码中更深的地方,并且您的活动被破坏,而您所持有的引用仍在范围内。您刚刚泄露了您的活动以及它所引用的所有内容。我建议不要将活动上下文传递到活动之外,除非真的必要,即使那样,也要确保控制生命周期。

因此,与 UI 无关的内容需要上下文,例如您需要获取字符串资源,然后使用应用程序上下文。在活动内部,并且在活动中声明了字符串引用,那么使用活动上下文是可以接受的,并且在我看来,这是首选,因为您正在就范围和生命周期做出有意识的决定。

也就是说,您应该询问这种特定方法是否更适合放在活动中。很可能不是,但请问问自己。

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

于 2012-11-08T22:00:16.313 回答
0

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

于 2012-11-08T22:04:27.127 回答