2013-01-03 290 views
0

我遇到了一些藍牙聊天問題(我認爲它與機器人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 
      } 
     } 
    } 

`

但不幸的是,我所做的更改終止了用戶界面,並在短時間後應用程序崩潰。

任何想法如何在不凍結用戶界面的情況下整潔地做到這一點?

+0

AsyncTask或Thread/Handler。 – 323go

+0

這似乎很奇怪......一個串行讀取緩衝區中不應該有足夠的數據使你的'foreach'循環甚至不會出汗,除非你不只是將這些字符發佈到一個文本框。它特別不應該導致崩潰。你有沒有更多的調試信息?你的'readBuf'數組有多大?他們多久進來一次?我的意思是,藍牙無法快速提供數據。還有其他一些事情正在發生。 –

+0

@J ... 嗯,我猜想,因爲微控制器的數據流速度相當快(我相信每15毫秒),可能導致UI鎖定和崩潰一段時間後(崩潰不會發生在固定的時間有時它只是不會崩潰) –

回答

3

你會希望手頭的工作開了一個後臺線程,以保持UI線程可以自由地響應輸入。我寫了一篇文章,回顧了後臺線程提供的一些不同方法:Using Background Threads in Mono For Android Applications

處理後臺線程時需要注意的一件事是,如果要對UI進行任何更改,你必須切換回UI線程。您可以通過使用RunOnUiThread()方法來完成此操作。

+0

你看他的代碼嗎?有一個線程沒有工作。他將字節抽入文本框 - 它不應該導致UI線程在任何顯着的持續時間內阻塞,也不會導致應用程序崩潰。 –

+0

@Greg我試着用'QueueUSerWorkITems'完成它,並嘗試了'RunOnUiThread',但我仍然得到相同的UI凍結。也許我從藍牙獲得的不斷輸入使這個? (微指令以固定的15ms間隔發送一些字節序列) –

1

的過程發生在創建一個新的線程。

public static void threadProcess() 
{ 
    Thread thread = new Thread() 
      { 
       public void run() 
       { 
       // Process that will run in the thread 
       } 
      }; 
      thread.start(); 
}