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);
      }
       }
    }

while(true) なしでメッセージを送信しようとすると、正常に動作しますが、上記のように、ハンドラーでメッセージを受信しませんでした。

誰かがこの問題で私を助けることができますか?

4

1 に答える 1

0

サービスはUIスレッドで実行されていると思います。したがって、無限ループが実行されている場合、アクティビティはメッセージに応答するための CPU 時間を取得できません。

while (true) {...} を実行する代わりに、Handlerを割り当てます。さまざまな post メソッドを使用して、UI スレッド上の他のすべてのアクティビティを完全にブロックすることなく、一定の間隔で繰り返したり、できるだけ速く処理したりすることができます。

于 2012-02-08T08:37:01.463 に答える