6

Bluetooth rfcomm接続に取り組んでいます。Android サンプルに理解できない行があり、残念ながら他の質問やリソースで適切な回答を見つけることができませんでした。

コード全体は次のとおりです。

public void run() {
        byte[] buffer = new byte[1024];  // buffer store for the stream
        int bytes; // bytes returned from read()

        // Keep listening to the InputStream until an exception occurs
        while (true) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer);
                // Send the obtained bytes to the UI activity
                mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                        .sendToTarget();
            } catch (IOException e) {
                break;
            }
        }
    }

    /* Call this from the main activity to send data to the remote device */
    public void write(byte[] bytes) {
        try {
            mmOutStream.write(bytes);
        } catch (IOException e) { }
    }

この行が理解できません:

 // Read from the InputStream
                    bytes = mmInStream.read(buffer);    
// Send the obtained bytes to the UI activity
                        mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                                .sendToTarget();

mHandlerこのコードでは定義されておらず、またMESSAGE_READ

何が何をするのか理解できませbytesんか?

コメントで述べたように、受信したバイトをメインアクティビティとして設定したアクティビティに送信すると思います。Static TextViewメイン アクティビティで sendToTarget() の代わりに を作成して、受信したメッセージを表示できますか?

4

1 に答える 1

7

の主な目的はHandler、プロデューサー スレッドとコンシューマー スレッドの間、ここでは UI スレッドとワーカー スレッドの間のインターフェイスを提供することです。の実装はHandlerコンシューマ スレッドに入ります。

あなたの場合、MESSAGE_READスレッド間で通信したいと考えています。

ハンドラーがないと、メインのアクティビティ スレッドから何もできません。

mHandlerしたがって、メイン アクティビティへの開始を探します。

デフォルトのハンドラー init は次のようになります。

Handler mHandler = new Handler(){
 @Override
    public void handleMessage(Message msg) {
 /**/
  }
};

Eclipse を使用している場合は、[プロジェクト] -> [Ctrl+H] -> [ファイル検索] -> [ハンドラー] をクリックします。

またはメモ帳++で->検索->ファイル内を検索....

[編集]

final int MESSAGE_READ = 9999; // its only identifier to tell to handler what to do with data you passed through.  

// Handler in DataTransferActivity
public Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
  switch (msg.what) {
    case SOCKET_CONNECTED: {
      mBluetoothConnection = (ConnectionThread) msg.obj;
      if (!mServerMode)
        mBluetoothConnection.write("this is a message".getBytes());
      break;
    }
    case DATA_RECEIVED: {
      data = (String) msg.obj;
      tv.setText(data);
      if (mServerMode)
       mBluetoothConnection.write(data.getBytes());
     }
     case MESSAGE_READ:
      // your code goes here

次のようなものを実装する必要があると確信しています:

new ConnectionThread(mBluetoothSocket, mHandler);

ここで見つけたソース

于 2013-08-03T09:01:24.340 に答える