2012-02-08 6 views
0

클래스의 데이터를 기본 UI 활동으로 보내야하고 메시지 전달과 함께이 작업을 수행하려고합니다.Android Message in loop

불행히도 내 처리기가 루프 내부에서 보낸 메시지를받지 못했습니다. 내가 지금까지 내 코드를 보여 서비스에서 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 시간이 전혀 필요하지 않습니다.

while (true) {...} 대신 Handler을 할당하십시오. 다양한 포스트 메서드를 사용하여 UI 스레드의 다른 모든 활동을 완전히 차단하지 않고 일정한 간격으로 또는 가능한 한 빨리 반복적으로 작업을 수행 할 수 있습니다.