繁体   English   中英

自定义应用程序类:构造函数与onCreate()

[英]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()有任何副作用?

这怎么可能?

这是有可能的,因为您的应用程序的每个进程都会调用ApplicationonCreate

例如, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM