我遇到了一些藍牙聊天問題(我認爲它與機器人Java和MonoForAndroid上的代碼相同)示例應用程序。我已將Android連接到使用藍牙模塊的微控制器。如果發送消息(只是原始字節到微控制器),它工作得很好!防止用戶界面在處理數據時被凍結
微控制器傳輸一個恆定的串行消息,我想讀取這些數據。有一個在BluetoothChat.cs應用程序命名爲MyHandler
,有一個代碼塊這樣的類:
case MESSAGE_READ:
byte[] readBuf = (byte[])msg.Obj;
// construct a string from the valid bytes in the buffer
var readMessage = new Java.Lang.String (readBuf, 0, msg.Arg1);
bluetoothChat.conversationArrayAdapter.Add(
bluetoothChat.connectedDeviceName + ": " + readMessage);
break;
所以我需要做的是處理傳入的原始數據,然後改變一些按鈕的顏色,所以我做的follwing更改上面的代碼:
case MESSAGE_READ:
byte[] readBuf = (byte[])msg.Obj;
//I have just added this code and it blocks the UI
bluetoothChat.ProcessIncomingData(readBuff);
break;
而在BluetootChat
活動我有這樣的方法:
public void ProcessIncomingData(byte[] readBuf)
{
if (_logBox != null)
{
_logBox.Text += "\r\n"; //TextView
foreach (var b in readBuf)
{
_logBox.Text += (uint)b + " "; //Show the bytes as int value
}
}
}
`
但不幸的是,我所做的更改終止了用戶界面,並在短時間後應用程序崩潰。
任何想法如何在不凍結用戶界面的情況下整潔地做到這一點?
AsyncTask或Thread/Handler。 – 323go
這似乎很奇怪......一個串行讀取緩衝區中不應該有足夠的數據使你的'foreach'循環甚至不會出汗,除非你不只是將這些字符發佈到一個文本框。它特別不應該導致崩潰。你有沒有更多的調試信息?你的'readBuf'數組有多大?他們多久進來一次?我的意思是,藍牙無法快速提供數據。還有其他一些事情正在發生。 –
@J ... 嗯,我猜想,因爲微控制器的數據流速度相當快(我相信每15毫秒),可能導致UI鎖定和崩潰一段時間後(崩潰不會發生在固定的時間有時它只是不會崩潰) –