11.Android学习之Handler消息处理(二)

本文详细介绍了Handler、Looper和MessageQueue在Android消息处理中的角色和关系。Handler发送和处理Message,Looper负责管理MessageQueue并读取消息,MessageQueue作为消息容器。在主线程中,系统默认初始化了Looper,而在子线程需手动创建。文章还强调了Message的使用注意事项,如使用MessagePool减少资源消耗,以及如何在子线程中创建Handler。最后,解答了Thread与Handler在更新UI上的区别以及Message属性的应用场景。
摘要由CSDN通过智能技术生成

目录

11.Handler消息处理(二)

2.Handler与Looper、MessageQueue 的关系

3.消息类(Message)

4.循环者(Looper)

5.难点解答

5-1.Thread 与Handler的区别

5-2.Message 常用属性的区别


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 用于指定用户自
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值