2012-02-08 75 views
0

我需要從一個類發送數據到主UI活動,我試圖通過消息傳遞做到這一點。安卓消息循環

不幸的是我的處理程序沒有收到循環內發送的消息。我告訴你我到目前爲止的代碼:

在UI活動

private final Handler mIncomingHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
      case MESSAGE_READ: 
       tedit.setText("Received " + msg.arg1); 
       break; 
      default: 
       super.handleMessage(msg); 
     } 
    } 
}; 

private final Messenger mMessenger = new Messenger(mIncomingHandler); 

private ServiceConnection mConnection = new ServiceConnection() { 
    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     mTransferServiceBound = true; 
     Message msg = Message.obtain(null, TransferService.MSG_REG_CLIENT); 
     msg.replyTo = mMessenger; 
     mTransferService = new Messenger(service); 
     try { 
      mTransferService.send(msg); 
     } catch (RemoteException e) { 
      Log.e(TAG, "Unable to register client"); 
     } 
    } 
    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     mTransferService = null; 
     mTransferServiceBound = false; 
    } 

}; 

在服務

private class IncomingHandler extends Handler { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
     case MSG_REG_CLIENT: 
      Log.d(TAG, "Activity client registered"); 
      mClient = msg.replyTo; 
      waitCommunication(); 
      break; 
     case MSG_UNREG_CLIENT: 
      mClient = null; 
      stopSelf(); 
      break; 
     default: 
      super.handleMessage(msg); 
     } 
    } 
} 
final Messenger mMessenger = new Messenger(new IncomingHandler()); 


private void waitCommunication() { 
     int i = 0; 
     while(true) { 
     try { 
     mClient.send(Message.obtain(null, MainActivity.Message_READ, i++, -1)); 
     } catch (RemoteException e) { 
     Log.e(TAG, "Unable to send Message", e); 
     } 
     } 
    } 

當我嘗試發送郵件沒有正常工作的,而(真),但就像我上面描述的,我只是沒有收到處理程序的任何消息。

有人可以幫我解決這個問題嗎?

回答

0

我認爲該服務正在UI線程上運行。因此,如果您有無限循環運行,則活動永遠不會有任何CPU時間來響應該消息。

而不是做,而(真){...}中,分配Handler。您可以使用其各種後置方法以定時的間隔或甚至儘可能快的速度重複執行任務,而不會完全阻止UI線程上的所有其他活動。