2013-08-03 14 views
6

Pracuję nad połączeniem Bluetooth rfcomm. W Próbce Androida jest wiersz, którego nie mogę zrozumieć i niestety nie mogłem znaleźć dobrej odpowiedzi w innych kwestiach i zasobach.Nie można zrozumieć mHandler.obtainMessage() w przykładzie Android Bluetooth

Oto cały kod:

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

nie mogę zrozumieć ten wiersz:

// 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 nie jest zdefiniowany w tym kodzie, a także MESSAGE_READ

nie mogę rozumiesz, co robi bytes?

Myślę, że jak wspomniano w komentarzu, wysyła otrzymane bajty do aktywności, którą ustawiam jako moją główną aktywność. Czy mogę utworzyć Static TextView w mojej głównej aktywności zamiast sendToTarget(), aby wyświetlić odebraną wiadomość?

+0

mHandler jest prawdopodobnie Zmienna instancji, zadeklarowana gdzieś w klasie. MESSAGE_READ jest prawdopodobnie stałą, zdefiniowaną w klasie lub poprzez statyczny import. – assylias

Odpowiedz

7

Głównym celem mHandler powiadomienie głównego wątku "GUI" o czymś. W twoim przypadku jest to MESSAGE_READ.

bez obsługi nie można nic zrobić z głównego wątku aktywności.

Dlatego poszukaj inicjacji mHandler w głównej aktywności.

Domyślna obsługi startowych powinny być jak:

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

Jeśli używasz Eclipse, kliknij na swój projekt -> Ctrl + H -> Szukaj File -> "Handler".

Albo w Notepad ++ -> serch -> Znajdź w plikach ....

[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 

Jestem pewien, że trzeba zaimplementować coś takiego:

new ConnectionThread(mBluetoothSocket, mHandler); 

źródła Znalazłem here

+0

Dzięki, a co z bajtami? Co to robi? – Bimbow

+0

zobacz moją redakcję opublikowałem –

+0

Hmm, myślę, że powinienem napisać cały kod tutaj. Będę edytować moje pytanie. – Bimbow

Powiązane problemy