2016-06-10 16 views
2

我正在查看Google的Bluetooth Chat sample application,他們在UI線程上寫入BluetoothSocketOutputStream。那是對的嗎?通常情況下,流阻塞,直到數據發送出去。在UI線程上將數據寫入BluetoothSocket

在我的測試中(與該應用程序),只要設備足夠接近,通信是及時的。當他們走得更遠時,這個連接就被放棄了。這是通過藍牙發送數據的正確方式嗎?我的郵件大小將由100-500字節。

+0

你確定他們在main(ui)線程上執行它? 「私人類ConnectedThread擴展線程{」從你的副本github鏈接 – once2go

+0

當他們進一步,連接被刪除 - 這是正常的行爲,Android自動處理它基於RSSI params,有時與握手包。有時它在硬件模塊上實現,但在驅動程序級別的現代設備中實現。 – once2go

+0

是的,我確定它在UI線程上。 'ConnectedThread.write()'方法是從發送按鈕的onClick處理程序調用的。我在調試器中檢查了這一點。 – Oliv

回答

1

我也想知道這一點,因爲據我可以告訴BluetoothChat在UI線程上寫藍牙數據,就像我發現的所有其他Android藍牙示例一樣 - 所有這些示例都基於BluetoothChat。

我已經做了一些更多的測試,沿線的那些奧利弗做過。使用運行4.4.4的三星T113,我發現寫60個字符的字符串通常需要12-14ms。但是,也有一些情況下寫入時間更長 - 35-45毫秒。此外,如果正在寫入的設備沒有讀取發送給它的消息,則發送設備上的緩衝區最終將被填充並且寫入操作將無限期阻止(請參閱Android BluetoothSocket OutputStream write blocks infinitely)。出於這些原因,我認爲一個寫藍牙的行爲良好的應用程序需要在主線程中完成。

(據Commonsware的馬克·墨菲,「主應用程序線程上的所有I/O是一個壞主意」,並BluetoothChat的寫作使用主線程的是「可能只是一個錯誤。」)

+0

感謝您的回答,您已經明確表示在UI線程上編寫/閱讀是一個錯誤。即使發送少量數據也不能保護您免受這種情況的影響。順便說一句,我沒有完成我的藍牙應用程序... – Oliv

1

由於文檔對此沒有提及,我做了自己的測試:我嘗試發送以下數量的數據並測量,寫入的最後時間。

 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讀緩衝區。當我逐字節讀取時,可能是一分鐘。

相關問題