Дизайн Android: как запустить 3 разных потока в фоновом режиме для мониторинга 3 разных устройств

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

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

  • Я думал об использовании 3 разных IntentServices. Но не уверен, что это лучший способ?

  • Я подумал об использовании службы и создании трех потоков, одного устройства foreach. Но я не был уверен, будут ли эти потоки работать, когда приложение не на переднем плане.

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


person Amal    schedule 20.07.2011    source источник


Ответы (2)


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

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

person cyngus    schedule 20.07.2011

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

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

person Thomas Dignan    schedule 20.07.2011
comment
Я изначально так же проектировал. Но затем я столкнулся с проблемой, когда я пытаюсь повторно подключиться к одному устройству, и, поскольку оно блокируется, отслеживание двух других устройств в это время не происходит. И чтение и запись блокируются в соответствии с документацией BluetoothSocket. У меня есть еще одно сомнение: если я создам поток из службы, будет ли он работать даже после того, как приложение перейдет в фоновый режим. - person Amal; 20.07.2011