Android UI线程和子线程通信

时间:2012-02-22 10:32:25

标签: android multithreading communication

我知道这是一篇很长的帖子,但请耐心等待我:)

目前我正在使用Handler类从子线程到主UI线程进行通信,并且我正在使用我的消息队列实现另一个方向的消息(从主线程到子线程)。 / p>

子节点知道发送消息的位置的方式是:在主线程中,在我创建Handler对象之后,我通过自己的消息队列发送它对子节点的引用,子线程然后存储引用值和因此将知道如何将消息发送到活动。

但是,我的应用程序中有多个活动,每个活动都需要与同一个子线程进行通信。我在一个Activity中创建的Handler对象在下一个Activity中无效,所以我每次创建一个新活动时(每次用户在活动之间切换)都会创建一个Handler对象,与之前完全相同,并将其引用发送给子线程。

我的问题是:

这是一种正确的做法吗? 有更简单的方法吗?从子节点到多个活动的通信?除了使用单例类或类似的东西,所以我不是每次都通过我的自定义队列发送引用,而是更新单例中的变量。

修改

根据要求,这是一些代码:

在每个Activity的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 个答案:

答案 0 :(得分:2)

听起来你想使用IntentService来实现你的子线程的功能(它已经像消息队列一样,为了节省你重新发明轮子),还有一个BroadcastReceiver允许孩子将其结果广播给任何感兴趣的一方(在您的情况下将是任何相关活动)。

See this tutorial以完全相同的方式使用IntentServiceBroadcastReceiver的好例子。