代码之家  ›  专栏  ›  技术社区  ›  Andrei Herford

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

  •  2
  • Andrei Herford  · 技术社区  · 7 年前

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

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

    这很好,但现在我在开发人员控制台中发现了一个崩溃日志,表明 MyApplication.onCreate() 在崩溃发生时未运行/尚未完成:代码崩溃是因为执行了某些初始化 myapplication.oncreate() 没有完成。

    这怎么可能? 我以为 myapplication.oncreate() 会在所有其他代码之前运行吗?对不对?

    可以移动吗 someCustomInit(); MyApplication 相反? 在创建应用程序对象之前,不应运行其他代码,对吗?

    或者使用构造函数而不是 OnCuto() ?

    3 回复  |  直到 7 年前
        1
  •  1
  •   CommonsWare    7 年前

    我假设myapplication.oncreate()将在所有其他代码之前运行?对不对?

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

    将somecustominit()移到myapplication的构造函数是否保存?

    那要看里面发生了什么 someCustomInit() . 你的 应用 尚未初始化。

    另一种可能是推翻 attachBaseContext() ,例如如何 ACRA is hooked in . 在那里,你通过了 Context 如果初始化需要 语境 .

        2
  •  2
  •   Andrey Danilov    7 年前

    这怎么可能?

    可能是因为 Application onCreate 是需要的 每道工序 你的应用程序。

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

    或者使用构造函数而不是 OnCurATE()?

    documentation :

    应用程序类或应用程序类的子类是 当 已创建应用程序/包。

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

    你应该把本该只运行一次的代码移到外面的其他地方 应用 班级。可能在一些 Singleton 从中调用 Launcher Activity 或史密斯。实际上如果你看到 sources 属于 应用 类您将看到该注释:

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

        3
  •  1
  •   Larry Schiefer    7 年前

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

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