2013-01-05 128 views
0

我正在嘗試將消息從線程傳遞到處理程序,但處理程序切換語句的處理程序操作從未得到處理。未處理Android處理程序操作

這是我的處理程序:

private Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     // TODO Auto-generated method stub 
     super.handleMessage(msg); 
     switch(msg.what) { 

     case SUCCESS: 
      ConnectedThread connectedThread = new ConnectedThread((BluetoothSocket)msg.obj); 
      String s = "Successfully Connected"; 
      connectedThread.write(s.getBytes()); 
      break; 
     case MESSAGE_READ: 
      byte[] readBuff = (byte[])msg.obj; 
      String string = new String(readBuff); 
      Toast.makeText(getApplicationContext(), string, 0).show(); 
     } 
    } 

}; 

這是該消息被傳遞給處理程序的線程run()方法。線程是一個內部類。

public void run() { 
     if (D) Log.e(TAG, "-- ConnectThread --"); 
     // Cancel discovery because it will slow down the connection 
     mBtAdapter.cancelDiscovery(); 

     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) 

     mHandler.obtainMessage(SUCCESS, mmSocket).sendToTarget(); 
     if (D) Log.e(TAG, "--SUCCESS--"); 
    } 

我不確定爲什麼這些操作沒有執行。

回答

0

通過查看代碼很難說出什麼問題。基本上,第二個線程需要引用第一個線程的處理程序。但是,將第二個線程中的mHandler引用與主線程中的mHandler對象關聯尚不清楚。他們屬於同一個班級嗎?第二個線程是包含mHandler對象的類的內部類嗎?

由於我很想自己做一個Handler Message實現,所以我寫了一個小例子。也許下面的例子會幫助你:

public class MessageHandlerActivity extends Activity { 

public TextView tv; 
private static final int SUCCESS = 0; 
private static final int FAIL = 1; 
private MessageActivityHandler mHandler = new MessageHandlerActivity.MessageActivityHandler(this); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    tv = new TextView(this); 
    tv.setText("waiting!"); 
    setContentView(tv); 
    new Thread(new MessageSenderActivity()).start(); 
} 

static class MessageActivityHandler extends Handler { 

    private final WeakReference<MessageHandlerActivity> mActivity; 

    MessageActivityHandler(MessageHandlerActivity activity) { 
     mActivity = new WeakReference<MessageHandlerActivity>(activity); 
    } 

    public void handleMessage(Message msg) { 
     super.handleMessage(msg); 
     switch(msg.what){ 
     case SUCCESS: 
      mActivity.get().tv.setText("juhu!"); 
      break; 
     case FAIL: 
      mActivity.get().tv.setText("fail!"); 
      break; 
     } 

    } 

}; 

private class MessageSenderActivity implements Runnable { 
    @Override 
    public void run() { 
     mHandler.obtainMessage(SUCCESS).sendToTarget(); 
    } 
} 

} 
+0

是的,它們屬於同一類。線程是一個內部類。 – user1909680

+0

我的代碼有幫助嗎?如果不是,那麼你應該發佈更多的代碼。 – joel

+0

是的,它確實有幫助。謝謝 – user1909680