(之前可能会提出这个确切的问题。我无法通过搜索找到它。如果你发现它有重复标记。)
在Android应用程序中,在这些情况下将对象存储在静态字段中是不是很糟糕?
Application
类中的实例变量中。然后,需要数据的类可以从Application
获得数据。Context
等。存储Context
(例如对Activity
或Application
的引用)是不好的做法在静态领域?这可以在需要的类中使用,例如一个LayoutInflater
或资源。目前,我将Context
传递给需要它们作为参数的方法。答案 0 :(得分: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;
}
}
在这种情况下,是的,您将获得相同的应用程序上下文的静态引用。