没有InputStream数据到达事件?

时间:2011-06-12 03:58:47

标签: java android stream bluetooth

简单的问题 - 是否有一种方法可以在数据到达输入流时触发事件?

our open source project中,我们只是循环,直到我们看到消息字符结束(沿着路径拼接消息)。循环在循环之间暂停300ms以降低CPU利用率,但这仍然与“事件驱动编程”相差甚远。

睡眠时间过长对吞吐量不利 睡眠太短对CPU,其他进程和上下文切换密集有害。

我想清理上面链接中的readUpToCharacter函数,以便以事件驱动的方式等待数据。

为这个看似常见的问题寻找一些聪明的设计模式。

感谢!!!

2 个答案:

答案 0 :(得分:2)

启动一个执行阻塞读取的新线程,并在数据到达时引发事件?

答案 1 :(得分:1)

根据输入流(如果它是具有底层文件描述符的输入流),您可以使用NIO Selector类来等待文件描述符准备好进行读取。

不幸的是,Android上提供的蓝牙流不提供对底层文件描述符的访问,并且available方法无法从一个Android设备可靠地工作到另一个Android设备,因此目前无法从您想要的地方做到Java代码。

编辑:我应该注意InputStream.available方法适用于某些Android设备(根据我的经验,使用Google的Android蓝牙端口实现的Nexus 1和早期HTC设备运行良好;三星和更新的HTC设备使用供应商提供的蓝牙端口实现可能会失败)因此,如果您的应用程序将部署在已知的设备子集上,您可能会很好地使用此选项。