Android之Handler、Looper、Message探索

本篇文章是根据Android中消息系统模型和Handler Looper的内容进行自己理解的修改与添加


通过Android文档描述的信息来看:


这里主要介绍了Handler的两个主要作用:

1.发送和处理消息或Runable在未来的某个时间点上。

2.使动作在不同的线程中执行。

谷歌为我们提供了一些消息发送方法: post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), and sendMessageDelayed(Message, long)。

post系列的方法针对的是Runable对象,Runable是一个接口,所有实现了这个接口的对象都覆写了run()方法。

sendMessage系列的方法针对的Message对象,这个msg对象可以包含一个Bundle数据,来通过Handler的handleMessage(Message)方法来处理。

当你通过这两种方式发送消息后,你既可以立即处理这个消息,也可以添加一个延时。

当一个应用程序运行时,主线程会自动运行一个消息队列来维护顶层相关的对象,如Activity、broadcast receiver等。你也可以自己创建一个Thread来和主线程打交道通过Handler,即前面所提的post或者sendMessage方法。


可以说Handler和消息分不开关系,我们来看看消息系统的组成:

消息原型  消息队列  发送消息  消息循环  消息获取  消息派发  消息处理


实际上Android将这七种部分封装并抽象了一下,变成了四个独立的部分:

Handler,Message,MessageQueue,Looper

Handler:发送和处理消息

Message:消息本身

MessageQueue:消息队列,Message都有序的排列在这里

Looper:消息循环


这里有一幅图描述了他们之间的关系:


Thread中,除了主UI线程创建的时候会自动创建一个Looper外,缺省情况下Thread不会创建Looper,需要我们手动创建。这里Android为我们提供了一个辅助类HandlerThread,

这个线程已经自动帮我们创建好了Looper。

Looper实现了消息的循环和消息的派发,也就是派发给handlerMessage来处理消息。

MessageQueue消息队列有Looper持有,但消息的添加则是通过Handler的post/sendMessage

所以消息系统模型的核心就是Looper。消息循环和消息队列都是由Looper建立的。

一个Thread中Looper是唯一的,一个Thread对应一个Looper。建立Handler的Looper属于哪个Thread,则Handler也属于哪个Thread(这里可能有些不好理解,可以自行浏览下Handler源码)。

Handler源码中提供了许多构造方法。创建一个Handler对象,如果构造方法中不指定一个新Looper的话,就说明次Handler仍然属于当前线程。例如在主UI线程中mHandler = new Handler();这个mHandler仍属于主UI线程。但是MyHandler handler = new MyHandler(handlerThread.getLooper());这个handler对象就属于handlerThread这个线程的了,因为传进来的Looper属于handlerThread。在这里面处理的消息(handlerMessage)都是异步的,即在handlerThread线程中处理的。


故建立Thread消息系统,就是将Thread的Looper交给Handler去打理,实现消息系统模型,完成消息的异步处理。

下一章我们会通过代码来建立一个消息系统。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值