Блокирует ли код в onHandleIntent IntentService получение других намерений?

У меня есть IntentService, который подключается к bluetooth (блокирующая часть), отправляет данные и отключается. Я изменил IntentService для обработки специального намерения, которое остановит службу. Однако кажется, что из-за блокирующего кода, который подключается к устройству Bluetooth (на неопределенный срок или до отмены пользователем, как предполагалось), переопределенный onStart или onStartCommand не вызывается до тех пор, пока блокирующая часть кода больше не блокируется.

Может ли код внутри onHandleIntent блокировать другие намерения, достигающие службы?


person jM2.me    schedule 24.04.2014    source источник


Ответы (1)


да. IntentService использует один рабочий поток.

Или, чтобы точно процитировать документы:

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

Из https://developer.android.com/reference/android/app/IntentService.html

Это означает, что одновременно в IntentService может выполняться только один вызов onStartCommand.

person arnorhs    schedule 24.04.2014
comment
В моем случае приложение может отправлять данные только после установления соединения. Будет ли нормальной практикой иметь соединительный поток внутри onHandleIntent, который будет отправлять сообщение обработчику с сообщением «годен» или «нет»? Что-то вроде этого pastebin.com/9BuSPNv4 - person jM2.me; 24.04.2014
comment
Нет, если вы используете IntentService, вам не следует запускать там свои собственные потоки. Или, скорее, похоже, что вы действительно хотите использовать обычную службу и запустить там свой собственный рабочий поток, используя все, что хотите (AsyncTask, HandlerThread, Executor и т. д.) - person arnorhs; 24.04.2014