Android-интерфейс потока и дочерний поток связи - PullRequest
1 голос
/ 22 февраля 2012

Я знаю, что это длинный пост, но, пожалуйста, потерпите меня:)

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

Способ, которым дочерний узел знает, куда отправлять сообщения: в основном потоке, после того как я создаю объект-обработчик, я отправляю его ссылку дочернему элементу через мою собственную очередь сообщений, затем дочерний поток сохраняет значение ссылки и Таким образом будет знать, как отправлять сообщения в деятельности.

НО, у меня есть несколько Активностей в моем приложении, и каждая из них должна общаться с одним и тем же дочерним потоком. Объект обработчика, который я создаю в одном действии, не будет действителен в следующем действии, поэтому я делал каждый раз, когда создается новое действие (каждый раз, когда пользователь переключается между действиями), каждый раз, когда я создаю объект обработчика , точно так же, как и раньше, и отправьте ссылку на дочерний поток.

МОИ ВОПРОСЫ:

Это правильный способ сделать это? Есть ли более простой способ сделать это? Из связи с дочерним узлом на несколько действий? За исключением использования, например, одноэлементного класса или чего-то еще, поэтому я не отправляю ссылку каждый раз через свою пользовательскую очередь, а вместо этого обновляю переменную в синглтоне.

EDIT

Вот некоторый код в соответствии с просьбой:

В методе onCreate каждой операции я делаю следующее:

...
//Create the main handler on the main thread so it is bound to the main thread's message queue. 
createHandler();

//Send to the controller the msg handler of the UI thread
  //Create messenger of appropriate type
  Messenger mess = new Messenger(_MSGHANDLER_);
  //Add the handler 
  mess.addContent(_HANDLERTAG_, mMainHandler);
  //Add the name of this activity
  mess.addContent(_ACTIVITYNAMETAG_, "RemyLoginActivity"); 
  //Add the message to the controller's queue 
  controller.enqueue(mess)
...

Функция createHandler создает объект-обработчик и присоединяет конкретную функцию обратного вызова.

//Create the handler on the main thread so it is bound to the main thread's message queue
private void createHandler()
{
    //Create the main handler on the main thread so it is bound to the main thread's message queue. 
    mMainHandler = new Handler() 
    {
        public void handleMessage(Message msg) 
        {
            //Get the messenger from the message  
            Messenger mess = (Messenger)msg.obj;
            Log.i( "Remy", "ActivityMainMenu::Message from Controller: " + mess.type());

            switch( mess.type() )
            {

                default: Log.i("Remy","OUPS::createHandler::Could not understand queue message type: " + mess.type());
                         break;
            }
        }
    };      
}

и, наконец, контроллер является дочерним потоком, в котором, когда он получает ссылку на обработчик, он просто сохраняет его, а затем отправляет сообщения следующим образом:

activityHandler.sendMessage( msg );

Надеюсь, я ничего не забыл.

1 Ответ

2 голосов
/ 22 февраля 2012

Звучит так, как будто вы хотите использовать IntentService для реализации функциональности вашего дочернего потока (он уже действует как очередь сообщений, чтобы избавить вас от повторного изобретения колеса) и BroadcastReceiver, чтобы позволить ребенку транслировать свои результатылюбому заинтересованному лицу (которое в вашем случае будет любым из соответствующих видов деятельности).

См. этот учебник для хорошего примера использования IntentService и BroadcastReceiver именно таким образом.

...