2013-08-03 8 views
6

Ich arbeite an Bluetooth-RFComm-Verbindung. Es gibt eine Zeile in Android Sample, die ich nicht verstehen kann und leider konnte ich in anderen Fragen und Ressourcen keine gute Antwort finden.Ich kann mHandler.obtainMessage() in Android nicht verstehen Bluetooth-Beispiel

Hier wird der gesamte Code ist:

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

ich diese Zeile nicht verstehen kann:

// 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 wird in diesem Code definiert und MESSAGE_READ

auch ich kann nicht Verstehen was macht bytes?

Ich denke und wie im Kommentar erwähnt, sendet es die empfangenen Bytes an die Aktivität, die ich als meine Hauptaktivität eingestellt habe. Kann ich in meiner Hauptaktivität eine Static TextView anstelle von sendToTarget() machen, um die empfangene Nachricht anzuzeigen?

+0

mHandler ist wahrscheinlich ein Instanzvariable, irgendwo in Ihrer Klasse deklariert. MESSAGE_READ ist wahrscheinlich eine Konstante, die in der Klasse oder über einen statischen Import definiert ist. – assylias

Antwort

7

Das Hauptziel von mHandler, Ihren Haupt "GUI" -Thread über etwas zu benachrichtigen. In Ihrem Fall ist es MESSAGE_READ.

ohne Handler können Sie nichts aus Ihrem Hauptaktivität Thread tun.

Suchen Sie daher nach mHandler Initiierung in die Hauptaktivität.

Die Standardprozedur init sollte wie:

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

Wenn Sie Eclipse, auf dem Projekt klicken -> Strg + H -> Dateisuche -> "Handler".

Oder in Notepad ++ -> Serch -> Find in Files ....

[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 

Ich bin sicher, dass Sie so etwas wie implementieren müssen:

new ConnectionThread(mBluetoothSocket, mHandler); 

Quellen gefunden here

+0

Danke, Wie wäre es mit Bytes? Was tut es? – Bimbow

+0

sehe meine Bearbeitung ich gepostet –

+0

Hmm, denke, ich sollte den ganzen Code hier schreiben. Ich werde meine Frage bearbeiten. – Bimbow

Verwandte Themen