将数据保存在静态变量中是不好的做法吗?

Pur*_*ari 8 java static android

(之前可能会提出这个确切的问题.我无法通过搜索找到它.如果你发现它有重复的标记.)

在Android应用程序中,在这些情况下将对象存储在静态字段中是不是很糟糕?

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

Mar*_*ini 16

是的,是的.:)

静态字段.过度使用静态字段存在很多问题.不仅它们通过有趣的边缘访问速度较慢,而且它们也很容易在一夜之间被Android破坏,并且通常很难检查它们的所有引用或用if填充你的getter/setter(sSomeStatic == null ){return new SomeStatic()}.可以将一个静态引用存储到一个名为(例如)ApplicationData的类中,你可以存储一些值,嘿,我们偶尔需要一些全局变量,但它很容易滥用它,每当我检查新的Android时我都会皱眉开发者的源代码.

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

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

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

现在上下文 ......哦,上下文.不要将Context存储在硬引用中.或者你会泄漏记忆.活动引用了View和许多其他内容.如果您存储了Context,那么您将存储活动,并且事情会变得糟糕.学习传递上下文,尽可能使用应用程序上下文,如果需要传递它,那么就是出于很好的理由.大多数情况下,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;
   }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 关于上下文的进一步阅读的好帖子是来自Double Encore的Dave Smith的[this one](http://www.doubleencore.com/2013/06/context/).最后的表格特别有用; 知道应该使用哪种类型的上下文来扩充布局是很好的. (2认同)