【问题标题】:Custom Application class: Constructor vs. onCreate()自定义应用程序类:构造函数与 onCreate()
【发布时间】:2018-06-05 11:16:16
【问题描述】:

我的一个 Android 应用程序使用自定义应用程序类来执行一些全局初始化。这是在onCreate() 方法中完成的:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        someCustomInit();
    }
}

这工作正常,但现在我在开发者控制台中发现了一个崩溃日志,表明MyApplication.onCreate() 没有运行/在崩溃发生时尚未完成:代码崩溃,因为执行了一些初始化@987654324 @ 不完整。

这怎么可能? 我假设MyApplication.onCreate() 会在所有其他代码之前运行?对不对?

someCustomInit(); 移动到MyApplication 的构造函数是否节省?在创建应用程序对象之前不应运行其他代码,对吗?

或者使用构造函数代替onCreate()有什么副作用吗?

【问题讨论】:

  • 在此处显示崩溃日志

标签: java android constructor oncreate


【解决方案1】:

我假设 MyApplication.onCreate() 会在所有其他代码之前运行?对不对?

ContentProvider 实例是在 onCreate()Application 调用之前创建的。理论上,您的堆栈跟踪应该会显示您的哪些代码在初始化之前被调用。

移动 someCustomInit(); 是否保存?改为 MyApplication 的构造函数?

这取决于someCustomInit() 中发生的情况。您的Application 尚未初始化。

另一种可能性是覆盖attachBaseContext(),例如ACRA is hooked in。在那里,如果您的初始化需要 Context,您将获得一个可以使用的 Context 对象。

【讨论】:

    【解决方案2】:

    Application 类是您的应用程序进程的单例,但它的 onCreate() 并不是第一个可能执行的代码。类字段初始值设定项、构造函数以及任何static 代码块(通常用于加载本机库)将首先执行。特别是 static 代码块将在运行时加载类时运行。

    通常,这不是问题,您最安全的方法是将您的特定代码放在onCreate() 方法中。

    【讨论】:

      【解决方案3】:

      这怎么可能?

      这是可能的,因为您的应用程序的每个进程都会调用Application class onCreate

      例如Service 可以在单独的进程中启动,因此您的应用程序可以启动两次。我在使用 Yandex.Appmetrica 库时遇到了这种行为。其实还不错,因为库崩溃不会影响应用的其他部分。

      或者使用构造函数而不是有任何副作用 onCreate()?

      来自documentation

      Application 类或 Application 类的子类是 当您的流程为您的任何其他类之前实例化 应用程序/包已创建。

      所以构造函数会被调用两次。有什么区别吗?

      您应该将应该只运行一次的代码移动到 Application 类之外的其他地方。可能在某些Singleton 中,将从Launcher Activity 或smth 调用。实际上,如果您看到 Application 类的 sources,您会看到该评论:

      通常不需要子类化应用程序。在大多数情况下, 静态单例可以以更模块化的方式提供相同的功能 方式。

      【讨论】:

        猜你喜欢
        • 2011-03-19
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-14
        • 2014-12-28
        相关资源
        最近更新 更多