2013-06-23 3 views
2

Я помогаю моему другу с Android-приложением, я не понимаю, почему я не могу получить функцию Handle, handleMessage(), чтобы получить вызов. Я в настоящее время пытаюсь общаться через bluetooth, у меня есть поток, обрабатывающий запись и поток, обрабатывающий чтение, поэтому я думаю, что я где-то испортил. Я действительно не умею с Thread с, мне было интересно, если кто-то может заметить мою ошибку! Я знаю, что функция записи работает, потому что я вижу, что чип bluetooth переходит в командный режим после написания кода "$$$".handleMessage функция не называется

MainActivity:

public class MainActivity extends Activity{ 
.... 
    private final Handler mHandler = new Handler(){ 
      @Override 
     public void handleMessage(Message msg) { 
      System.out.println("in mHandler");//NOT CALLED 
       switch (msg.what) { 
        case (MESSAGE_READING): 
        byte[] readBuf = (byte[])msg.obj; 
        String readMessage = new String(readBuf,0,msg.arg1); 
        System.out.println("READ: " + readMessage); 
        break; 
       default: 
         System.out.println("default!"); 
        break; 
       } 
      } 
     }; 
     ... 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
     mConnectThread = new ConnectThread(device, mHandler); 
     mConnectThread.run(); 
     ListenerThread mListener = new ListenerThread(mConnectThread,mHandler); 
     mListener.run(); 
    } 

ConnectThread:

public class ConnectThread{ 

public final BluetoothSocket mmSocket; 
public final BluetoothDevice mmDevice; 
private final Handler mHandler; 
public static ConnectedThread mConnectedThread; 

public ConnectThread(BluetoothDevice device, Handler mHandler) { 
    // Use a temporary object that is later assigned to mmSocket, 
    // because mmSocket is final 
    BluetoothSocket bs = null; 
    mmDevice = device; 

    // Get a BluetoothSocket to connect with the given BluetoothDevice 
    try { 
     // MY_UUID is the app's UUID string, also used by the server code 
     UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); //Standard Serial Port Service ID 
     bs = device.createRfcommSocketToServiceRecord(uuid); 
    } catch (IOException e) { 
     System.err.println("IOException in ConnectThread"); 
    } 

    this.mHandler = mHandler; 
    mmSocket = bs; 
} 

public void run() { 
    //TODO Cancel discovery because it will slow down the connection 

    try { 
     // Connect the device through the socket. This will block 
     // until it succeeds or throws an exception 
     mmSocket.connect(); 
    } catch (IOException connectException) { 
     // Unable to connect; close the socket and get out 
     try { 
      mmSocket.close(); 
     } catch (IOException closeException) { } 
     return; 
    } 

    // Do work to manage the connection (in a separate thread) 
    mConnectedThread = new ConnectedThread(mmSocket, mHandler); 
    mConnectedThread.run(); 

} 
... 
} 

ConnectedThread:

public class ConnectedThread extends Thread { 
.... 
public void manageConnectedSocket() { 

    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); 
      System.out.println("Reading bytes."); 
      status = MESSAGE_READING; 
      // Send the obtained bytes to the UI activity 
      Message msg = Message.obtain(mHandler, MESSAGE_READING, bytes, -1, buffer); 
      mHandler.sendMessage(msg); 
     } catch (IOException e) { 
      System.err.println("Error reading input"); 
      break; 
     } 
     status = READY; 
    } 
} 
... 
} 

ListenerThread:

public class ListenerThread extends Thread { 

... 

public final BluetoothSocket mmSocket; 
private final Handler mHandler; 
private final ConnectedThread mConnectedThread; 

public ListenerThread(ConnectThread mConnectThread, Handler mHandler){ 
    this.mHandler = mHandler; 
    mmSocket = mConnectThread.mmSocket; 
    this.mConnectedThread = mConnectThread.getConnectedThread(); 
} 

public void run(){ 
    while (true){ 
     if (getStatus() == READY){ 
      write("$$$".getBytes()); 
      break; 
     } 
    } 
} 
... 
} 

Я посмотрел еще пару вопросов о handleMessage, но они не помогли. Есть идеи?

EDIT: Только что поняли, что это много кода. В основном я прохожу mHandler в разные темы, я думал, что здесь происходят какие-то плохие вещи. У меня есть ConnectThread, ConnectedThread и ListenerThread. Документация для Android, на которую я смотрел, по bluetooth сказал, чтобы работать в фоновом режиме, потому что некоторые из вызовов (write, read, device.connect()) блокируют вызовы.

ответ

3

Я думаю, что проблема с вашим кодом в том, что вы начинаете свои темы с помощью метода run(), это означает, что вы просто выполняете метод run() на объекте. Но вместо этого вы должны вызвать метод start(), который запустит новый поток и автоматически вызовет ваш метод run().

Вот цитата из Thread.start() метода документации

Причины этой нити, чтобы начать выполнение; виртуальная машина Java вызывает метод запуска этого потока.

+0

Итак, весь мой код, который в настоящее время находится в локальных методах 'run()' в моих классах Thread, должен быть перенесен на 'start()'? – ToastyMallows

+0

Да, это правильно – Desert

+0

Ой, подождите, может быть, я не был достаточно ясен, вам не нужно куда-то перемещать код, просто сделайте что-то вроде mConnectThread.start() вместо mConnectThread.run(). – Desert