0

BluetoothChat (ボット Java と MonoForAndroid で同じコードを信じている) のサンプル アプリに問題があります。Bluetooth モジュールを使用して Android をマイクロコントローラーに接続しました。メッセージを送信する場合 (マイクロコントローラへの生のバイトのみ) は問題なく動作します!

マイクロコントローラは一定のシリアル メッセージをストリーミングしており、そのデータを読み取りたいと考えています。次のようなコード ブロックを持つBluetoothChat.csMyHandlerアプリで名前が付けられたクラスがあります。

    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 スレッドが自由に入力に応答できるようにするために、作業をバックグラウンド スレッドに渡す必要があります。バックグラウンド スレッドを実行するために利用できるさまざまな方法のいくつかを概説した投稿をしばらく前に書きました。Android アプリケーション用に Mono でバックグラウンド スレッドを使用する

バックグラウンド スレッドを処理する際に注意すべきことの 1 つは、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 に答える