Тег NFC с резьбой принимает вызовы на Android

В моем приложении мне нужно выполнить несколько считываний тегов NFC-A с помощью NfcA.transceive().

Кроме того, приложению необходимо выполнять медленные вызовы API, связанные с различными данными чтения.

Поэтому я запускаю Callables в отдельных потоках для обработки различных задач read->API.

Это безопасный подход? Строка комментария к приему говорит, что

Это операция ввода-вывода, и она будет заблокирована до завершения.

Гарантирует ли это, что мои вызовы на прием (из разных потоков) не будут мешать друг другу?


person Martin    schedule 04.01.2016    source источник


Ответы (1)


Да, согласно документам, другие потоки будут ждать, однако вы должны знать следующее:

public void close () Также вызывает отмену всех заблокированных операций ввода-вывода в другом потоке и возврат с IOException

Таким образом, если какой-либо поток вызывает close(), это приведет к тому, что все остальные ожидающие потоки получат исключение IOException. Как узнать, какой поток является последним, чтобы правильно вызвать close()? И что произойдет, если тег выйдет за пределы допустимого диапазона до завершения всех потоков?

Я бы предложил альтернативный подход, выполняя все операции чтения/передачи последовательно в одном потоке, когда каждая операция завершена, помещайте данные в очередь для обработки другим пулом потоков, прежде чем переходить к следующей операции передачи. Это позволяет избежать блокировки, так же быстро, проще справиться с очисткой, если тег выходит за пределы допустимого диапазона и т. д.

person griffinjm    schedule 05.01.2016
comment
у вас есть проект с открытым исходным кодом, демонстрирующий вашу идею о рабочем потоке Nfc - person Karam; 24.11.2020