我试图弄清楚BluetoothGattCallback中的处理程序是否必须在单独的线程上执行,或者是否需要及时返回。换句话说,我可以在onCharacteristicChanged()处理程序中进行任何冗长的计算,还是应该将数据存储在队列中或调用单独的线程并立即返回?如果我没有快速从回调中返回(比如设备是流数据),是否有可能丢失数据?我没有这样的设备来测试,但是知道如何设计回调会很好,所以我知道如何设计我的处理程序。
任何人都知道这是如何工作的,或者有足够的经验来猜测它是如何工作的?谢谢!
答案 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),但你仍然不应该花费很长时间,因为你可能会耗尽线程池。