码迷,mamicode.com
首页 > 移动开发 > 详细

Android消息处理

时间:2015-08-26 17:32:36      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

基本概念:

Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。

Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。

MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。

Looper:消息泵,不断从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper。

Thread:线程,负责调度整个消息循环,即消息循环的执行场所。

三步实现线程的消息处理机制:

1. 用Looper.prepare()创建Looper(消息泵,不断从MessageQueue中抽取Message执行(Message Pool大小为10个))

2. 用handler处理消息

3. 用Looper.loop()进入循环

* 主线程默认提供该机制,其它线程默认没有Looper对象。如果想让我们新创建的线程拥有Looper对象时,我们首先应在线程run()方法当中调用Looper.prepare()方法,然后再在run()方法最后调用Looper.loop()方法。典型的用法如下:

class LooperThread extends Thread {      

        public Handler mHandler;      

        public void run() {      

                   Looper.prepare();      

                   mHandler = new Handler() {

                         public void handleMessage(Message msg) {

                               // process incoming messages here

              }

          };     

                  Looper.loop();      

         }      

}

* 倘若我们的线程中已经存在Looper对象,则我们可以通过Looper.myLooper()获取,此外我们还可以通过Looper.getMainLooper()获取当前应用系统中主线程的Looper对象。

HandlerThread:

HandlerThread是一个封装好的带有looper的线程类,它继承了Thread类,本质上就是一个线程,在非UI线程中想要实现消息机制,就可以使用它,步骤如下:

HandlerThread thread = new HandlerThread("MyHandlerThread"); //创建并启动线程

thread.start();

mHandler = new Handler(thread.getLooper()); //创建Handler对象时将HandlerThread中的looper对象传入

mHandler.post(new Runnable(){...});

注意事项:

* 当线程A需要发消息给线程B的时候,线程B要用自己的Looper实例化Handler类,在线程中实例化Handler时我们需要保证线程当中包含Looper

* 线程A中应实例化Message类,再用Handler类的方法sendMessage将该消息发送给线程B处理(要先实例化Handler类)

* 实例化Message类的两种方法:new Message() / 调用Handler类中的obtainmessage()方法(要先实例化Handler类)

Message msg = handler.obtainMessage();

msg.arg1 = i;

msg.sendToTarget(); 

Message msg=new Message();

msg.arg1=i;

handler.sendMessage(msg);

* 第一种写法是message 从handler 类获取,从而可以直接向该handler 对象发送消息,第二种写法是直接调用 handler 的sendMessage方法发送消息。

* handler.post(runnable)方法和handler.sendMessage()方法原理相同,只不过是将Runnable转成一个Message。当不确定当前线程时(不知道传哪个looper),更新UI时尽量调用View.post(Runnable action)方法。该方法中,View会自动获取当前线程(即UI线程)的Handler,然后将action对象post到Handler里。在Handler里,它将传递过来的action对象包装成一个Message(Message的callback为action),然后将其投入UI线程的消息循环中。在Handler再次处理该Message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法。而此时,已经路由到UI线程里,因此,我们可以毫无顾虑的来更新UI。

Android消息处理

标签:

原文地址:http://www.cnblogs.com/changxuyouqing/p/4760746.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!