Задать вопрос
@fspare

Инициализация Android приложения — как избавиться от тормозов при запуске?

Здравствуйте!

Сейчас занялся разработкой android приложения, суть его заключается в том, что бы сохранять местоположение пользователя в локальный журнал, что бы он потом мог посмотреть где он был в течении дня.

Сейчас мои подозрения падают на то, что эта проблема скорее всего связанная с тем, что инициализация производится в классе, который наследуется от MultiDexApplication в методе onCreate (т.е. забивается UI thread.).
С другой стороны эту инициализацию нужно провести до того как начать использовать приложение(до того как перейти в какую-то activity).

Ниже привожу кусок кода из класса App. Может быть можете что-либо посоветовать?

@Override
public void onCreate() {
    super.onCreate();
    // инициализировать библиотеку для работы с кастомными шрифтами, назначить Roboto Regular по умолчанию
    CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                    .setDefaultFontPath("fonts/Roboto-Regular.ttf")
                    .setFontAttrId(R.attr.fontPath)
                    .build()
    );
    // инициализировать библиотеку для закачивания изображений из сети
    Fresco.initialize(this);

    App.context = getApplicationContext();
    // инициализировать автоматическую отправку изображений
    ACRA.init(this);
    // инициализировать схему базы данных
    DbHelper instance = DbHelper.getInstance();
    Logger.info(getClass(), "Db helper initialized: "+instance);

    //запуск и привязка созданного сервиса, отвественного за получения обновлений Location'a с App переменной
    Intent intent = new Intent(this, AndroidLocationService.class);

    bindService(intent, new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Logger.info(getClass(), "on service conntected");
            androidLocationService = ((ServiceAwareBinder<AndroidLocationService>)service).getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            androidLocationService = null;
        }
    }, Context.BIND_AUTO_CREATE);

    startService(intent);
}


UPD:

В общем пока что обходным решением сделал следующее - сделал Splash screen activity. В нем запускается async task (в бэкграунде), в котором собственно и происходит инициализация. Вроде бы User experience улучшился, но проблема в том, что при старте на какое-то короткое время все еще "серый фон" появляется. В onCreate внутри подкласса MultiDexApplication осталось только:

@Override
public void onCreate() {
    super.onCreate();
    App.context = getApplicationContext();
    App.instance = this;
}
  • Вопрос задан
  • 3878 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
thelongrunsmoke
@thelongrunsmoke
Программист
Откажитесь от синхронного сервиса. Проверьте скорость инициализации fresco.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы