Инициализация приложения для Android

в настоящее время я сталкиваюсь со следующей проблемой: всякий раз, когда мое приложение Android запускается, ему нужно выполнить некоторый трудоемкий код инициализации. Без этого кода все мои действия / услуги в приложении будут работать неправильно.

до сих пор я поместил этот код инициализации в действие SplashScreen, которое я объявил как основное действие в манифесте. После того, как код инициализации был выполнен, я заканчиваю () заставку и запускаю фактический main действие, то есть действие, состоящее из нескольких вкладок, из которых пользователь может достичь нескольких других действий.

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

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

есть ли у кого-нибудь идея, где и как я могу правильно инициализировать свое приложение при запуске?

код инициализации:

public void init() {
    if (initialized) {
        return;
    }

    // Initialize terms
    List<Tag> tags= DynamicDao.loadAll(Tag.class);
    int numTags = tags.size();
    terms = new String[numTags];
    for (int i = 0; i < numTags; i++) {
        terms[i] = tags.get(i).getTag();
    }

    // Initialize document-term matrix
    List<Item> items = DynamicDao.loadAll(Item.class);
    createDocumentTermMatrix(items);

    initialized = true;
}

Примечание: элемент имеет несколько связанных тегов, из которых мне нужно создать вектор документа.

3 ответов


насколько дорого стоит ваша инициализация? Что вы там делаете? В общем, я бы рекомендовал не использовать заставку (это мобильное приложение, а не настольное приложение). Вместо этого используйте рабочий поток для инициализации данных во время отображения основного пользовательского интерфейса, а затем используйте обработчик для инициализации пользовательского интерфейса после завершения рабочего потока.

в качестве альтернативы, я бы посмотрел, почему ваша инициализация занимает так много времени и оптимизирует ее. Что ты там делаешь?


Если вам действительно нужно выполнить длительную операцию, вы должны использовать AsyncTask. Он очень прост в использовании, он предоставляет вам две функции под названием onPreExecute и onPostExecute реализовывались, которые вызываются в основном потоке соответственно до и после операции. Все дорогие вещи должны идти в doInBackground который будет работать в рабочем потоке.

пока вы делаете эту операцию, вы можете показать диалог прогресса (создание его внутри вышеупомянутого onPreExecute) показывает прогресс того, что вы делаете, используя один из предоставленных обратных вызовов: onProgressUpdate затем вы закроете диалог в вышеупомянутом inside onPostExecute реализовывались


Если вы хотите сохранить текущую заставку, у вас есть несколько вариантов.

Если ваша структура данных не слишком колоссальна, вы можете сохранить ее в onSaveInstanceState и восстановить ее в onRestoreInstanceState и/или onPostCreate.

Если данные слишком велики, вам может просто нужно проверить, инициализировано ли ваше приложение в onResume или одном из других различных методов запуска, таких как onRestart, onStart и т. д. (Я все еще немного туманен, когда именно каждый должны использовать.) Если нет, запустите действие заставки.

советы от других по этой теме также хороши. Но это может работать для вас, если вам нужно быстро исправить.