2012-02-08 92 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线程上的所有其他活动。