Сообщение Android в цикле - PullRequest
       30

Сообщение Android в цикле

0 голосов
/ 08 февраля 2012

Мне нужно отправить данные из класса в основной пользовательский интерфейс Activity, и я пытаюсь сделать это с помощью передачи сообщений.

К сожалению, мой обработчик не получил сообщение, отправленное внутри цикла.Я покажу вам свой код:

В пользовательском интерфейсе

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

Когда я пытаюсь отправить сообщение без времени (правда) работает нормально, но, как я описал выше, я просто не получил никакого сообщения от обработчика.

Может кто-нибудь помочь мне с этой проблемой?

1 Ответ

0 голосов
/ 08 февраля 2012

Я думаю, что служба работает в потоке пользовательского интерфейса.Таким образом, если у вас работает бесконечный цикл, у Activity никогда не будет времени ЦП для ответа на сообщение.

Вместо выполнения while (true) {...}, выделите Handler .Вы можете использовать различные методы post, чтобы делать что-то неоднократно через определенные промежутки времени или даже настолько быстро, насколько это возможно, без полной блокировки всей другой активности в потоке пользовательского интерфейса.

...