2013-08-03 29 views
6

Tôi đang làm việc trên kết nối rfcomm Bluetooth. Có một dòng trong Mẫu Android mà tôi không thể hiểu và tiếc là tôi không thể tìm thấy câu trả lời hay trong các câu hỏi và tài nguyên khác.Không thể hiểu mHandler.obtainMessage() trong mẫu Android Bluetooth

Dưới đây là toàn bộ mã:

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

Tôi không thể hiểu dòng này:

// 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 không được định nghĩa trong mã này và cũng MESSAGE_READ

tôi không thể hiểu những gì hiện bytes làm gì?

Tôi nghĩ và như đã đề cập trong nhận xét, nó sẽ gửi Bytes đã nhận đến Hoạt động mà tôi đặt làm Hoạt động chính của tôi. Tôi có thể thực hiện Static TextView trong Hoạt động chính của mình thay vì sendToTarget() để hiển thị thông báo đã nhận không?

+0

mHandler có lẽ là một biến thể hiện, được khai báo ở đâu đó trong lớp của bạn. MESSAGE_READ có thể là một hằng số, được định nghĩa trong lớp hoặc thông qua một lần nhập tĩnh. – assylias

Trả lời

7

Mục tiêu chính của mHandler để thông báo cho chuỗi "GUI" chính của bạn về một thứ gì đó. Trong trường hợp của bạn là MESSAGE_READ.

mà không cần xử lý, bạn không thể làm gì ngoài Chủ đề hoạt động chính của mình.

Vì vậy, hãy tìm kiếm mHandler bắt đầu vào Hoạt động chính.

handler Giá trị mặc định init nên được như thế:

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

Nếu bạn sử dụng Eclipse, click vào dự án của bạn -> Ctrl + H -> File Search -> "Handler".

Hoặc trong Notepad ++ -> Serch -> Tìm trong các tập tin ....

[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 

tôi chắc chắn rằng bạn phải thực hiện một cái gì đó như:

new ConnectionThread(mBluetoothSocket, mHandler); 

nguồn tôi đã tìm thấy here

+0

Cảm ơn, Làm thế nào về Bytes? Nó làm gì? – Bimbow

+0

xem chỉnh sửa của tôi tôi đã đăng –

+0

Hmm, Hãy suy nghĩ tôi nên viết toàn bộ mã ở đây. Tôi sẽ chỉnh sửa câu hỏi của mình. – Bimbow

Các vấn đề liên quan