目录
2.Handler与Looper、MessageQueue 的关系
11.Handler消息处理(二)
2.Handler与Looper、MessageQueue 的关系
Handler并不是单独工作,与Handler共同工作的有几个重要的组件,主要有Message、Looper和MessageQueue。
◆Message:通过Handler 发送、接收和处理的消息对象。
◆Looper:负责管理MessageQueue。每个线程只能有一个Looper,它的loop()方法负责读取MessageQueue中的消息,读取到消息之后就把消息回传给Handler进行处理。
◆MessageQueue:消息队列,可 以看作是一个存储消息的容器。它采用FIFO (先进先出)的原则来管理消息。在创建Looper 对象时,会在它的构造器中创建MessageQueue对象。
在Android中,一个线程对应一 个Looper 对象,而一个Looper对象又对应一个MessageQueue,MessageQueue用于存放Message。Handler 发送Message给Looper管理的MessageQueue,然后Looper又从MessageQueue中取出消息,并分配给Handler进行处理。
因此,要在程序中使用Handler,必须在当前线程中有一个Looper 对象。线程中的Looper对象有以下两种创建方式:
◆在主 UI 线程中,系统已经初始化了一个Looper对象,因此在程序中可以直接创建Handler,然后就可以通过Handler 进行发送消息和处理消息。
◆在子线程中,必须手动创建一个Looper 对象,并通过loop()方法启动Looper。
在子线程中使用Handler的步骤如下:
(1)调用Looper的prepare()方法为当前的线程创建Looper对象,在创建Looper对象的构造器中会创建与之配套的MessageQueue。
(2)创建Handler子类的实例,重写handlerMessage()方法,用来处理来自于其他线程的消息。
(3)调用Looper的loop()方法启动Looper。
注:在一个线程中,只能有一个Looper和MessageQueue, 但是可以有多个Handler,而且这些Handler可以共享同一个Looper和MessageQueue。
3.消息类(Message)
消息类(Message)被存放在MessageQueue中,一个MessageQueue中可以包含多个Message对象。每个Message对象可以通过Message.obtain()或Handler.obtainMessage()方法获得。一个Message对象具有如表11.2所示的5个属性。
表11.2 Message对象的属性
属性 | 类型 | 描述 |
---|---|---|
arg1 | int | 用来存放整型数据 |
arg2 | int | 用来存放整型数据 |
obj | Object | 用来存放发送给接收器的Object类型的任意对象 |
replyTo | Messenger | 用来指定此Message发送到何处的可选Messenger 对象 |
what | int | 用于指定用户自 |