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

Ответить
slbel
Сообщения: 36
Зарегистрирован: 31 мар 2015, 13:25

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

Сообщение slbel » 03 апр 2015, 10:33

Доброго всем времени суток!

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

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

Аватара пользователя
ivannatobedev
Сообщения: 30
Зарегистрирован: 03 дек 2014, 13:27

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

Сообщение ivannatobedev » 08 апр 2015, 16:13

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

Ответить