[英]Custom Application class: Constructor vs. onCreate()
我的一个Android应用程序使用自定义Application类执行一些全局初始化。 这是在onCreate()
方法中完成的:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
someCustomInit();
}
}
这项工作正常,但是现在我在开发人员控制台中发现了一个崩溃日志,该日志指示MyApplication.onCreate()
在崩溃发生时没有运行/尚未完成:代码崩溃了,因为执行了一些MyApplication.onCreate()
初始化MyApplication.onCreate()
不完整。
这怎么可能? 我假设MyApplication.onCreate()
将在所有其他代码之前运行? 那不正确吗?
移动someCustomInit();
是否省钱someCustomInit();
改为MyApplication
的构造函数? 在创建应用程序对象之前,不应运行任何其他代码,对吗?
还是使用构造函数代替onCreate()
有任何副作用?
这怎么可能?
这是有可能的,因为您的应用程序的每个进程都会调用Application
类onCreate
。
例如, Service
可以在单独的过程中启动,因此您的应用程序可以启动两次。 使用Yandex.Appmetrica
库时,我遇到了这种Yandex.Appmetrica
。 实际上,这还不错,因为库崩溃不会影响应用程序的其他部分。
还是使用构造函数代替onCreate()有任何副作用?
从文档中 :
创建应用程序/包的过程时,将在任何其他类之前实例化Application类或Application类的子类。
因此,构造函数将被调用两次。 有什么区别吗?
您应该将应该只运行一次的代码移到Application
类之外的其他地方。 可能在某些Singleton
,这将从Launcher Activity
或smth中调用。 实际上,如果您看到Application
类的源代码 ,则会看到以下注释:
通常不需要子类化Application。 在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。
我假设MyApplication.onCreate()将在所有其他代码之前运行? 那不正确吗?
ContentProvider
实例是在Application
上调用onCreate()
之前创建的。 从理论上讲,堆栈跟踪应该显示初始化之前正在调用的代码。
移动someCustomInit()是否省钱? 改为MyApplication的构造函数?
那将取决于someCustomInit()
发生的事情。 您的Application
尚未初始化。
另一种可能性是重写attachBaseContext()
,例如ACRA的挂钩方式 。 如果初始化需要Context
,则会向您传递一个可以使用的Context
对象。
Application
类是您的应用进程的单例,但是其onCreate()
并不是第一个可能执行的代码。 类字段初始化程序,构造函数以及任何static
代码块(通常用于加载本机lib)将首先执行。 特别是, static
代码块将在运行时加载类时运行。
通常,这不是问题,最安全的方法是将特定的代码放在onCreate()
方法中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.