【问题标题】:Is it bad practice to keep data in static variables?将数据保存在静态变量中是不好的做法吗?
【发布时间】:2013-11-15 10:43:10
【问题描述】:

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

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

【问题讨论】:

  • 修改静态变量通常是不好的做法。
  • 存储对Application 实例的静态引用是完全可以的。

标签: java android static


【解决方案1】:

是的,是的。 :)

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

是的,以单例模式存储您的应用程序实例并使用它,但不要仅仅因为您可以YOURAPP.getInstance().SomeLazyValueYouAddedHere(); 就在您的应用程序实现中添加 200 个静态字段@

这很糟糕。这会导致不良做法,并且会比访问硬引用的良好设计要慢。

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

现在是上下文……哦,上下文。永远不要将上下文存储在硬引用中。否则你会泄漏内存。一个活动引用了 View 和许多其他的东西。如果您存储上下文,那么您将存储活动并且事情从那里开始变坏。学习传递上下文,尽可能使用应用程序上下文,如果你需要传递它,这样做是有充分理由的。大多数情况下,App 上下文足以获取资源、字符串等。 如果要存储上下文,请始终存储 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;
   }
}

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

【讨论】:

  • 关于 Context 的进一步阅读的好帖子是来自 Double Encore 的 Dave Smith 的 this one。最后的表格特别有用;知道应该使用哪种类型的上下文来扩展布局是很好的。
  • 感谢您的精彩回答。只需添加,我目前将所有数据保存在一个对象的字段中。该对象集中存储在我的Application 中,因此任何活动都可以读取它,但活动随后会将对它的引用存储在非静态成员中。
  • 这样也不错。请记住,该对象可能在一夜之间(甚至在您的应用程序在后台运行几分钟后)为空,因此请准备好恢复数据。某些设备在后台停止后几分钟就会删除您的应用程序的堆。话虽如此,存储对 YourApplication.getInstance().getYourAppData() 的引用还不错,只是不要把所有东西都扔在那里,明智地使用它:)
  • 使用ApplicationClass.getInstance()anActivity.getApplication()(我目前正在使用的)有区别吗?
  • @amitav13 不,我只是有经验。当 android 内存不足时,事情会被清除,我看到静态引用指向 null。我没有进行太多调查,但我只是围绕不必使用静态东西重新架构它:)
猜你喜欢
  • 2011-08-13
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 2011-02-14
  • 2011-09-22
  • 2021-01-20
  • 2011-07-07
  • 2011-06-01
相关资源
最近更新 更多