2012-02-08 5 views
0

クラスからメインのUIアクティビティにデータを送信する必要があります。メッセージの受け渡しを行う際にこれを実行しようとしています。Androidのメッセージ

残念ながら、私のハンドラはループ内で送信されたメッセージを受信しませんでした。私はあなたのこれまでの私のコードを示しています。サービスの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スレッド上の他のすべてのアクティビティを完全にブロックすることなく、時間をおいた間隔で、またはできるだけ早く何度も繰り返し実行します。

関連する問題