Здравствуйте!
Сейчас занялся разработкой 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;
}