2013-08-03 9 views
6

私はBluetooth rfcomm接続で作業しています。 Androidサンプルには、私が理解できないラインがあります。残念ながら、他の質問やリソースではうまく答えられませんでした。私は、この行を理解することはできませんAndroidのBluetoothサンプルでmHandler.obtainMessage()を理解できません

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は何を理解していますか?

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

+0

mHandlerはおそらくあなたのクラスのどこかで宣言されたインスタンス変数。 MESSAGE_READは、おそらくクラス内または静的なインポートを介して定義された定数です。 – assylias

答えて

7

メインの「GUI」スレッドに何かについて通知することの主な目標はmHandlerです。あなたの場合はMESSAGE_READです。

ハンドラなしでは、あなたの主要なアクティビティスレッドから何もできません。

したがって、mHandlerがメインアクティビティに開始されていることを確認してください。

initはようにする必要があり、デフォルトのハンドラ:Eclipseを使用している場合は、あなたのプロジェクトをクリックし

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

- > Ctrlキー+ H - >ファイル検索 - > "ハンドラー"。

やメモ帳で++ - > SERCH - >ファイル内を検索....

[EDIT]

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); 

ソースが見つかりましたhere

+0

ありがとう、バイトはどうですか?それは何をするためのものか? – Bimbow

+0

私の編集を参照してください投稿 –

+0

うーん、私はここでコード全体を書くべきだと思う。私は私の質問を編集します。 – Bimbow

関連する問題