Пользовательский класс приложения: конструктор или onCreate () - PullRequest
0 голосов
/ 05 июня 2018

Одно из моих приложений для Android использует собственный класс Application для выполнения некоторой глобальной инициализации.Это делается с помощью метода onCreate():

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

Это работает нормально, но теперь я обнаружил в консоли разработчика журнал сбоев, который показал, что MyApplication.onCreate() не выполнялся / не завершился в то времяпроизошел сбой: произошел сбой кода, потому что некоторая инициализация, которая была выполнена MyApplication.onCreate(), не была завершена.

Как это возможно? Я предполагал, что MyApplication.onCreate() будет выполняться раньше, чем весь другой код?Разве это не правильно?

Можно ли переместить someCustomInit(); в конструктор MyApplication вместо этого? Никакой другой код не должен запускаться до создания объекта приложения, верно?

Или есть какие-либо побочные эффекты от использования конструктора вместо onCreate()?

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Класс Application - это одноэлементный процесс вашего приложения, но его onCreate() не первый возможный код для выполнения.Инициализаторы полей класса, конструктор, а также любые блоки кода static (часто используемые для загрузки собственных библиотек) будут выполняться первыми.В частности, блоки кода static будут выполняться при загрузке класса во время выполнения.

Обычно это не проблема, и ваш самый безопасный путь - поместить ваш конкретный код в метод onCreate().

0 голосов
/ 05 июня 2018

Как это возможно?

Это возможно, поскольку Application class onCreate вызывается для каждого процесса вашего приложения.

Например, Service может быть запущен в отдельном процессе, поэтому ваше приложение может быть запущено дважды.Я встречал такое поведение при использовании Yandex.Appmetrica библиотеки.На самом деле это неплохо, потому что сбои в библиотеке не затронут другие части приложения.

Или есть ли какие-либо побочные эффекты от использования конструктора вместо onCreate ()?

Из документации :

Класс Application или ваш подкласс класса Application создается перед любым другим классом при создании процесса для вашего приложения / пакета.

Таким образом, конструктор будет вызываться дважды.Есть ли разница?

Вы должны переместить свой код, который должен выполняться только один раз, куда-нибудь еще, за пределы Application класса.Вероятно, в некотором Singleton, который будет вызываться из Launcher Activity или чего-то еще.На самом деле, если вы видите sources из Application class, вы увидите этот комментарий:

Обычно нет необходимости создавать подкласс Application.В большинстве ситуаций статические синглтоны могут предоставлять ту же функциональность более модульным способом.

0 голосов
/ 05 июня 2018

Я предполагал, что MyApplication.onCreate () будет запускаться раньше всего остального кода?Разве это не правильно?

ContentProvider экземпляры создаются до того, как onCreate() вызывается на Application.Теоретически, ваша трассировка стека должна показать вам, какой ваш код вызывается до вашей инициализации.

Сохранено ли это для перемещения someCustomInit ();вместо конструктора MyApplication?

Это будет зависеть от того, что происходит в someCustomInit().Ваш Application еще не инициализирован.

Другая возможность - переопределить attachBaseContext(), например, как ACRA подключен в .Там вам передают Context объект, который вы можете использовать, если для инициализации требуется Context.

...