Android Design: как запустить 3 разных потока в фоновом режиме для мониторинга 3 разных устройств - PullRequest
1 голос
/ 20 июля 2011

У меня есть приложение, в котором я хочу отслеживать 3 устройства Bluetooth на предмет их статуса с телефона Android.Для этого мне нужно отправить некоторые данные на каждое устройство и проверять правильность их ответа каждые 5 секунд.И я хочу, чтобы эта обработка происходила даже тогда, когда приложение не в Foreground.Я думал о различных решениях, но я не мог найти какое-либо хорошее решение.

  • Я думал об использовании IntentService.Но IntentService использует один поток для выполнения всей обработки.Но я бы хотел 3 разных потока, потому что 5 секунд между каждой проверкой малы, и я не могу переключаться между проверками устройств в одном потоке.
  • Я думал об использовании 3 разных IntentServices.Но Не уверен, что это лучший способ?
  • Я подумал об использовании Сервиса и порождении 3 потоков, одного устройства foreach.Но я не был уверен, будут ли эти потоки работать, когда приложение не на переднем плане.

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

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

Один сервис, три потока - это то, что вы хотите.Наличие одного потока, выполняющего ввод-вывод на нескольких устройствах, похоже на то, что он вызывает проблемы, создавая ненужные зависимости.Все потоки выполняются независимо от того, является ли приложение передним или задним.

Платформа Android не имеет способа остановить запуск потока.Выполнение потока управляется Dalvik.Каркас перестает доставлять события в основной поток приложения, когда он находится в фоновом режиме (кроме событий, таких как BroadcastIntents), но он не говорит Dalvik приостановить все потоки в этом процессе.Это как бы побеждало цель фоновой обработки, если бы это делало.

0 голосов
/ 20 июля 2011

Вам не обязательно нужны три темы.Вам определенно нужны три BluetoothSocket s.Вы могли бы справиться с этим, просто имея один Сервис, который запускает поток из onStartCommand () и убивает его в onDestroy ().Поток должен выполнить цикл и проверить, существует ли активное соединение с каждым устройством, а если его нет, он должен попытаться восстановить соединение.Как только соединение установлено, оно должно записать и затем прочитать с устройства в соответствии с его протоколом.Ничто не мешает вам писать / читать на нескольких устройствах в одном потоке.Для этого вы можете использовать неблокирующий ввод-вывод, проверяя, есть ли байты для чтения на каждой итерации, пока вы их не найдете, а затем предпринимая действие на основе того, что вы получаете.сделайте это вне потока, который проверяет устройства, так как вы можете попросить пользователя ввести пин-код устройства.Просто сделайте фоновый поток для чтения / записи на каждом из трех устройств.Вы можете обнаружить, что вам нужно несколько потоков, это просто вопрос вкуса ... Необходим только один поток.

...