Нет данных InputStream прибыл событие? - PullRequest
2 голосов
/ 12 июня 2011

Простой вопрос - есть ли способ вызвать событие, которое запускается в момент поступления данных во входной поток?

В нашем проекте с открытым исходным кодом мы просто зацикливаемся, пока не увидим символ конца сообщения (перемещение по очереди для добавления сообщения по пути). Цикл делает паузу в 300 мс между циклами, чтобы уменьшить загрузку процессора, но это все еще далеко от «программирования, управляемого событиями».

слишком длинный сон вреден для пропускной способности слишком короткий сон вреден для процессора, других процессов и интенсивного переключения контекста.

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

В поисках некоторых хитроумных шаблонов для решения этой, казалось бы, распространенной проблемы.

Спасибо !!!

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

Создать новый поток, который выполняет блокирующее чтение, и вызывает ли он событие при получении данных?

1 голос
/ 12 июня 2011

В зависимости от входного потока (если он имеет базовый дескриптор файла), вы можете использовать классы селектора NIO для ожидания готовности дескриптора файла к чтению.

К сожалению, потоки Bluetooth, предоставляемые в Android, не обеспечивают доступ к базовому файловому дескриптору, и метод available не работает надежно с одного устройства Android на другое, поэтому в настоящее время невозможно выполнить то, что вы хотите, из кода Java .

РЕДАКТИРОВАТЬ: я должен отметить, что метод InputStream.available работает на некоторых устройствах Android (по моему опыту, устройства Nexus 1 и более ранние версии HTC, которые используют реализацию Android-порта Google от Google, подходят; Samsung и более поздние устройства HTC, использующие поставщика -поддерживаемые реализации порта Bluetooth печально терпят неудачу), поэтому, если ваше приложение будет развернуто на известном подмножестве устройств, вы могли бы преуспеть с этой опцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...