在我的应用程序中,我使用公共类Globals来保存我设置的静态变量,并通过p.e参考它们来获取整个应用程序。 Globals.someString:
public class Globals {
// several static variables for use in the whole application:
static String someString = "";
}
我的应用似乎工作正常。但是现在我到处读到全局变量应该在Application的子类中定义,或者在自己的单例类中定义,并且可以通过setter和getters来访问。
我现在的问题是:我自己使用全局变量的方法有什么缺点吗?内存泄漏p.e.或其他问题?
答案 0 :(得分:2)
两部分答案:
第1部分:神话和理论
一般来说,在面向对象时,不建议使用静态Globals,因为它非常难以控制。那个使用Singleton
与getter / setter一起使用的建议来自哪里。它是一个更可控的可管理环境。但是,如果您是该应用程序的唯一开发人员并且不介意它。这是真正的最佳实践,并不是应用程序正常运行所必需的。
子类Application
或者你自己的公共类没有任何区别,如果你所使用的是字符串,整数等等。如果你&#39,它是互联网上常见的子类应用程序。 ;重新初始化需要Context的对象,例如数据库。就我个人而言,我并不喜欢这种做法。它减慢了启动时间,并可能保留我在内存中不需要的大对象。对于那些类型,我通常会进行延迟初始化,其中我持有public static
我的应用程序的引用,每当我打电话时,MyDatabase.get();
get()
我检查if(instance==null)
然后使用公共可访问的Application
对象初始化它。
如果你保留Activity,Fragment或View对象的Android静态引用,你将不可避免地遇到内存问题。这些类是BIG,它们包含对其他大对象的引用,它们使用大量内存,这就是为什么框架具有令人烦恼的life-cycle
和saveState
的原因。因此,当需要内存时,它们可以被销毁,并且当它们重新出现在屏幕上时可以重新构建。
第二部分:Android方式
在Android中不建议只保留public static
上对象的引用,因为这些对象将永远保留在内存中,而手机不像是具有太字节RAM的网络服务器。整个Android Framework都有一个记录良好且稳定的结构,通过Bundle
对象传递和保存值(字符串,整数等)。这些捆绑包可以通过Intent
传递给活动,也可以通过setArguments(Bundle)
传递给碎片,它们可以用于使用onSavedInstanceState
方法保存当前状态。这些是以Android方式做事的可行方式。它还有助于促进课堂分离,甚至你可能听起来像小项目的大量工作,对于更大的项目,它是保持结构和组织的方法之一。
答案 1 :(得分:0)
来自http://developer.android.com/guide/faq/framework.html:
跨活动/服务访问数据的另一种方法是使用公共静态字段和/或方法。您可以从应用程序中的任何其他类访问这些静态字段。
来自http://developer.android.com/reference/android/app/Application.html:
通常不需要子类Application。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。如果你的单例需要一个全局上下文(例如注册广播接收器),那么检索它的函数可以给一个Context,它在第一次构造单例时在内部使用Context.getApplicationContext()。
所以在我看来,使用静态变量是完全有效的。