Android BluetoothGattCallback是否需要及时返回?

时间:2014-06-04 09:37:29

标签: android bluetooth-lowenergy android-bluetooth

我试图弄清楚BluetoothGattCallback中的处理程序是否必须在单独的线程上执行,或者是否需要及时返回。换句话说,我可以在onCharacteristicChanged()处理程序中进行任何冗长的计算,还是应该将数据存储在队列中或调用单独的线程并立即返回?如果我没有快速从回调中返回(比如设备是流数据),是否有可能丢失数据?我没有这样的设备来测试,但是知道如何设计回调会很好,所以我知道如何设计我的处理程序。

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

1 个答案:

答案 0 :(得分:0)

当我致电Thread.currentThread().getId()(来自connectGatt())和onScanResult()

时,我打印了onCharacteristicChanged()

这些是带注释的结果。

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),但你仍然不应该花费很长时间,因为你可能会耗尽线程池。