Android Handler Looper Message MessageQueue

首先介绍一下这几个类。

Message:包含一个结构数据对象(实体类对象)和描述的结构体,Handler可以通过Message对象发送信息。经常用到的Message的除了what域之外,还包含两个int类型的域(arg1、arg2)和一个Object域。还有一个重要的域是callback(Runnable类型变量)。当使用Messenger跨进程传递obj时,只允许传递framework预定义的Parcelable类对象,不可以传递自定义的Parcelable对象。当传递其他的数据时,使用setData方法。Message的构造方法虽然是public的,官方推荐最好不要new一个Message对象。获取一个Message对象通常方法是Message.obtain()或者Handler.obtainMessage()方式。Message中有个Message对象缓存池,无论使用Message.obtain()还是Handler.obtainMessage()均是取自缓存池。


Handler:Handler可以处理和发送与某一线程的相关联的MessageQueue的Message和Runnable。一个Handler只与一个线程相关联,并且只处理该线程中的MessageQueue中的Message与Runnable。Handler有两种常用方式:1.在其他线程中执行某操作;2.定时器。两种调用方式,一种是post一个Runnable,另一种是send一个Message。一般使用方式,直接new一个Handler。当使用不传递Looper的构造方法生成对象时,请确保生成此对象的线程已经有Looper,否则会抛异常。由于主线程已有Looper,所以可以直接new一个Handler对象。Handler中一个重要方法--dispatchMessage。1.当Message的callback不为空时,调用callback的run方法;2.如果Handler的callback不为空时,调用mCallback.handleMessage(msg);3.如果以上两个均没有被调用时,调用handleMessage(msg)。


Looper:一个不断在loop Message的东西,不允许通过构造方法生成对象。重要方法prepare,在一个线程中不允许多次调用。prepare方法中生成一个Looper对象和一个MessageQueue对象,并通过ThreadLocal保证一个线程中只有一个Looper对象,即一个线程中只有一个MessageQueue对象。loop方法,不断从响应的MessageQueue对象中,获取到Message并分发给对应的Handler。


MessageQueue:一个保存从Handler send或者Post过来的Message队列。有两个重要方法,enqueueMessage和next。当Handler post或者send过来Message时,最终会使用enqueueMessage排队。Looper调用next方法从中不断的获取Message分发。


总结一下:一个线程最多只有一个Looper,一个Looper中只有一个MessageQueue。但是一个线程中可能会有多个Handler。Looper中的loop方法会根据Message的target分发给各个Handler消息。

HandlerThread是一个不错的学习如何自己创建一个Looper对象的类。Looper文档中也有建议。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值