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 线程上运行。因此,如果你有一个无限循环运行,Activity 将永远不会获得任何 CPU 时间来响应消息。

而不是做 while (true) {...},分配一个Handler。您可以使用它的各种 post 方法以定时间隔重复执行操作,甚至尽可能快地执行操作,而不会完全阻塞 UI 线程上的所有其他活动。

于 2012-02-08T08:37:01.463 回答