Страница 1 из 1

FileInputStream.read() как корректно прервать

Добавлено: 03 апр 2015, 10:33
slbel
Доброго всем времени суток!

Проясните, пожалуйста, такой момент.
Программа обращается к удаленному устройству при помощи (FileInputStream) inputstream.read(). Допустим устройство зависло, и не отвечает совсем. Поток будет находиться в таком блокирующем состоянии бесконечно долго. Послать какой-нибудь dummy байт в поток я не могу (нет loopback). Как корректно прервать? Завести еще один поток, который будет отслеживать состояния зависания потока с блокирующим read и прервать выполнение потока?
Тогда вопрос, как прервать корректно поток с read()?
В отличие от windows тут нет никакого тайм-аута на выполнение операции read()? :(

ЗЫ: Обмен идет в режиме USB Accessory, устройство не отключено, просто зависло. Может такое быть, что при этом Broadcast Receiver не получит сообщение ACTION_USB_ACCESSORY_DETACHED?
А если и получит, как корректно прервать поток с блокирующим read()?

Re: FileInputStream.read() как корректно прервать

Добавлено: 08 апр 2015, 16:13
ivannatobedev
Я хоть и новичок, но попробую помочь.
1. Для работы с (FileInputStream) inputstream.read() вам придется отлавливать IOException. Так вот можно использовать try with resources, где в ресорсес вы можете закрыть буффер (и еще много всего полезного наверно =)).
2. Для того, чтобы закрыть поток его нужно вывести из состояния runnable(перевести в ожидание любое) и потом вызвать interrupt().
3. Для отслеживания блокировки можно завести таймер с отсрочкой, который будет выводить поток из фазы runnable.(аргумент delay у timer.schedule() и будет Ваш тайм-аут)