0

我在使用 BluetoothChat 时遇到了一些问题(我相信它在 bot 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;

所以我需要做的是处理传入的原始数据,然后改变一些按钮的颜色,所以我对上面的代码进行了以下更改:

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
            }
        }
    }

`

但不幸的是,我所做的更改会停止 UI,并且应用程序会在短时间内崩溃。

任何想法如何在不冻结 UI 的情况下巧妙地做到这一点?

4

2 回答 2

3

您需要将工作交给后台线程,以使 UI 线程能够自由地响应输入。不久前我写了一篇文章,概述了一些可用于执行后台线程的不同方法:Using Background Threads in Mono For Android Applications

处理后台线程时要小心的一件事是,如果要对 UI 进行任何更改,则必须切换回 UI 线程。您可以使用该RunOnUiThread()方法执行此操作。

于 2013-01-03T23:19:35.763 回答
1

为要在其中发生的进程创建一个新线程。

public static void threadProcess()
{
    Thread thread = new Thread()
            {
                public void run()
                {
                // Process that will run in the thread
                }
            };
            thread.start();
}
于 2013-01-03T23:11:09.483 回答