Android 的 BluetoothGattCallback 需要及时返回吗?

4
我正在尝试弄清楚BluetoothGattCallback中的处理程序是否必须在单独的线程上实现,或者它们是否需要及时返回。换句话说,在onCharacteristicChanged()处理程序中我能否进行任何漫长的计算,或者应该将数据存储在队列中或调用一个单独的线程并立即返回?如果我不快速从回调函数中返回(比如设备正在流式传输数据),是否有可能丢失数据?我没有这样的设备来测试,但知道回调函数的设计方式将有助于我设计处理程序。

有人知道这是如何工作的,或者有足够的经验来猜测它是如何工作的吗?谢谢!


我仍然无法回答这个问题。到目前为止,似乎并不是这种情况,但我的内部“回调”处理都没有太长时间。 - Brian Reinhold
考虑到BluetoothGatt接口不会排队传出请求(即您必须串行地一次一个地完成任务),它似乎也可能不会排队传入响应。通过在特征更改中放置睡眠,轻松进行测试。 - Kevin
1个回答

2

在调用connectGatt()(来自onScanResult())和onCharacteristicChanged()时,我打印了Thread.currentThread().getId()

这些是带注释的结果。

06-01 11:50:38.022  12205-12205/? D/MainActivity﹕ startScanning() in thread 1  // GUI thread is 1.
06-01 11:50:38.484  12205-12217/? D/MainActivity﹕ calling connectGatt in thread 371  // onScanResult() is called in a background thread.
06-01 11:50:39.877  12205-12233/? D/MainActivity﹕ Characteristic changed in thread 373 // onCharacteristicChanged() is called in a background threa.
06-01 11:50:40.906  12205-12234/? D/MainActivity﹕ Characteristic changed in thread 374 // Seems like there is a pool of three background threads.
06-01 11:50:41.876  12205-12217/? D/MainActivity﹕ Characteristic changed in thread 371
06-01 11:50:42.904  12205-12216/? D/MainActivity﹕ Characteristic changed in thread 370
06-01 11:50:43.878  12205-12233/? D/MainActivity﹕ Characteristic changed in thread 373
06-01 11:50:44.903  12205-12234/? D/MainActivity﹕ Characteristic changed in thread 374
06-01 11:50:45.878  12205-12217/? D/MainActivity﹕ Characteristic changed in thread 371

总之,似乎onCharacteristicChanged()在三个后台线程中的一个中被调用。我测试了一次连接设备和三次连接设备,两种情况下都使用了三个线程。

因此,您可能不需要非常快(以避免阻止GUI),但仍然不应该花费太长时间,因为您可能会使用完线程池。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接