Проблема запуска службы Android в onCreate of Activity

Я попытался запустить службу и привязать ее к моему методу Activity onCreate(). Когда я впоследствии пытаюсь вызвать функцию из службы, например commSessionManagerService.startCommandUpperM(), возникает NullPointerException. Вот код, который я использую для запуска службы и привязки к ней:

    Intent startIntent = new Intent(this, CommSessionManagerService.class);
    startService(startIntent);
    Intent bindIntent = new Intent(this, CommSessionManagerService.class);
    bindService(bindIntent, conn, Context.BIND_AUTO_CREATE);

Если я перемещу функцию startCommandUpperM() в onStartCommand() в CommSessionManagerService, выполнение метода onCreate займет несколько секунд. В качестве связанного примечания я создал и запустил поток в функции startCommandUpperM().


person user3328205    schedule 19.02.2014    source источник
comment
Пожалуйста, разместите больше кода. Когда именно вы звоните startCommandUpperM();? Ваш связующий работает?   -  person FD_    schedule 19.02.2014
comment
в startCommandUpperM код, как показано ниже: csThread = new CommSessionThread(this); csThread.start(); и в CommSessionThread (public void run() { while(runningFlag) { switch(commSession.getSessionState()) { case PsmConstants.STATE_TRANSMIT: commSession.transmit(); break; case PsmConstants.STATE_RECEIVE: commSession.receive(); break; case PsmConstants.STATE_SUSPEND: перерыв; case PsmConstants.STATE_IDLE: перерыв; по умолчанию: перерыв;} } })   -  person user3328205    schedule 19.02.2014
comment
Вы возвращаете сам объект CommSessionManagerService в onBind() в сервисе? Пожалуйста, опубликуйте код onBind().   -  person Aduait Pokhriyal    schedule 19.02.2014


Ответы (1)


Это потому, что ваш Service фактически привязан к UiThread. Поскольку onCreate также работает в UiThread, ваш вызов bindService приводит к тому, что Handler.post(Runnable) будет вызываться в обработчике основного потока.

Поэтому, когда bindService возвращается, Service еще не привязан. Чтобы обойти эту проблему, вы должны поместить свой код, использующий ваш Сервис, внутрь ServiceConnection.onServiceConnected().

person Antoine Marques    schedule 19.02.2014
comment
Спасибо :), это работает хорошо, но теперь метод onCreate будет занимать несколько секунд, когда я помещаю startCommandUpperM в onServiceConnected, у меня создается поток и он запускается в startCommandUpperM, это нормально? - person user3328205; 19.02.2014
comment
по-моему вполне нормально =) - person Antoine Marques; 19.02.2014