我正在查看来自Google的Bluetooth Chat sample application,他们会在UI线程上写信BluetoothSocket
的{{1}}。那是对的吗?通常,流阻塞直到数据被发送出去。
在我的测试中(使用该应用程序),只要设备足够接近,通信就会提示。当他们走得更远时,连接被丢弃了。这是通过蓝牙发送数据的正确方法吗?我的邮件大小将为100-500字节。
答案 0 :(得分:2)
由于文档没有说明这一点,我做了我自己的测试:我尝试发送以下数据量并测量,写入持续多长时间。
Old Android 2.3 device Recent Android 5.0 device
1kB 12ms 2ms
4kB 15-20ms 2ms
64kB 25-35ms 7ms
128kB 10-17ms 6ms
256kB 2000-3000ms 3000ms
由于我将发送少于1kB的金额,我将在UI线程上进行。他们在“官方”示例聊天应用程序中也这样做。
似乎Android有一些至少128kB的内部缓冲区,所以可以编写短消息而不用后台线程来打扰自己。
然而,读取128kB在另一台设备上花费了第二或第二。我用过4kB读缓冲区。当我逐字节读取时,可能是一分钟。
答案 1 :(得分:2)
我也想知道这一点,因为据我所知,蓝牙可以在UI线程上写入蓝牙数据,就像我发现的其他所有Android蓝牙示例一样 - 所有这些都是基于BluetoothChat。 / p>
我按照那些奥利夫的做法做了一些测试。使用运行4.4.4的Samsung T113,我发现写入60个字符串时,写入通常需要12-14ms。但是,也有一些情况下写入时间更长--35-45ms。此外,如果正在写入的设备没有读取发送给它的消息,则最终发送设备上的缓冲区将填满,写操作将无限期地阻塞(参见Android BluetoothSocket OutputStream write blocks infinitely)。出于这些原因,我认为写一个表现良好的应用程序需要在主线程中写入蓝牙。
(根据Commonsware的Mark Murphy的说法,“主应用程序线程上的所有I / O都是一个坏主意”,而BluetoothChat使用主线程进行编写“可能只是一个bug。”)
答案 2 :(得分:1)
https://developer.android.com/guide/topics/connectivity/bluetooth#ManageAConnection
当然,有一些实施细节需要考虑。在 特别是,您应该使用专用线程从 流并对其进行写入。这很重要,因为 read(byte [])和write(byte [])方法阻止了调用。的 read(byte [])方法将阻塞,直到需要读取一些内容为止。 流。 write(byte [])方法通常不会阻塞,但是可以 如果远程设备未调用read(byte []),则阻止流控制 足够快,中间缓冲区因此变满。 因此,线程中的主循环应专用于读取 InputStream。线程中的一个单独的公共方法可用于 启动写入OutputStream。