9

在 Android 应用程序中,在这些情况下将对象存储在静态字段中是不好的做法吗?

  1. 应用数据。在应用程序运行时将应用程序数据保存在类中的静态变量中是否不好?目前,我将数据存储在我Application班级的一个实例变量中。然后需要数据的类可以从Application.
  2. Context's 等。在静态字段中存储 a Context(例如对 anActivity或 an的引用)是不好的做法吗?Application这可以在需要例如 aLayoutInflater或资源的类中使用。目前,我将Contexts 传递给需要它们作为参数的方法。
4

1 回答 1

18

是的,是的。:)

静态字段。过度使用静态字段存在很多问题。它们不仅访问速度较慢,而且很容易被 Android 一夜之间销毁,而且在整个地方检查它们的引用或用if (sSomeStatic == null) { return new SomeStatic()}. 可以存储对名为(例如)ApplicationData 的类的静态引用,您可以在其中存储一些值,嘿,我们时不时需要一些全局变量,但它很容易滥用,以至于我每次检查新的 Android 时都会皱眉开发者的源代码。

是的,将您的 Application 实例存储在单例模式中并使用它,但不要仅仅因为您可以这样做而在您的 Application 实现中添加 200 个静态字段YOURAPP.getInstance().SomeLazyValueYouAddedHere();

那很不好。它会导致不良做法,并且会比拥有访问硬引用的良好设计要慢。

我可以永远继续下去,但是关于这个有很多 StackOverflow 讨论(有些激烈!)。如果您在这里,我假设您是在寻求经验;我在不同的项目中做了几年的 Android,我的经验一直是静态越少越好。

现在是上下文……哦,上下文。永远不要将上下文存储在硬引用中。否则你会泄漏内存。一个活动引用了 View 和许多其他的东西。如果您存储上下文,那么您将存储活动并且事情从那里开始变坏。学习传递上下文,尽可能使用应用程序上下文,如果你需要传递它,这样做是有充分理由的。大多数情况下,App 上下文足以获取资源、字符串等。如果要存储 Context,请始终存储context.getApplicationContext();永远不要存储静态活动上下文。你也可以用谷歌搜索,StackOverflow 有一些很好的答案。

如果你买得起一本且只有一本 Android 书,那就买一本 BNR。尽管 Android 可能会不时发布新的 SDK,但这些概念是完全有效的,作者使用的模式是处理活动、上下文、片段等的正确方法。

更新您的应用程序应如下所示:

public class YourApp extends Application {
   private static YourApp sInstance;
   public YourApp() {
      super();
      sInstance = this;
   }
   public static YourApp getInstance() {
      return sInstance;
   }
}

在这种情况下,是的,您将获得对相同 App Context 的相同静态引用。

于 2013-11-04T18:17:14.123 回答