Handler是android提供用于更新UI的一套机制,也是消息处理机制。也可以说是消息传递机制。
Handler的主要作用有2个
1.在新启动的线程中发送消息
2.在主线程即UI线程中获取并处理消息
说明:启动一个APP时,首先会开启一个主线程(UI线程),主要管理UI界面,更新UI等操作
a.如果进行一个耗时的操作,请求后台数据,并更新UI。这时候请求后台数据是需要时间的,不能放在主线程中进行。需要开启一个子线程来执行请求数据的操作
b.请求完成后,需要更新UI,就需要用到Handler了,Handler运行在主线程中,通过Message对象来传递数据,子线程发送Message对象给主线程,接收消息并处理更新UI等操作。
使用方法:
private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); tv.setText("msg.arg1:"+msg.arg1+"--msg.arg2:"+msg.arg2); } }; new Thread(new Runnable() { @Override public void run() { Message msg = new Message();//消息对象 msg.arg1 = 99;//携带参数 msg.arg2 = 100;//携带参数 Object str = new Object();//实例化对象 msg.obj = str; //携带参数为实体类对象 handler.sendMessage(msg) } });2.Handler的主要方法
handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例,都会绑定到创建他的线程中(一般是位于主程),它有两个作用:
(1)合理调度安排消息和runnable对象,使它们在将来的某个点被执行.
(2)安排一个动作在不同的线程中执行
Handler中开启线程和分发消息的一些方法:
post(Runnable)直接开启Runnable线程
postAtTime(Runnable,long)在指定的时间long,开始启动线程
postDelayed(Runnable long)在延迟long时间后,启动Runnable线程
sendEmptyMessage(int) 发送指定的消息,通过参数int来区分不同的消息
sendMessage(Message)发送消息到UI线程中
sendMessageAtTime(Message,long) 这个long代表的是系统时间,不推荐用
sendMessageDelayed(Message,long) 此方法long代表调用后几秒后执行。
sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.
handler基本使用: 1)在主线程中,使用handler很简单,new一个Handler对象实现其handleMessage方法,在 handleMessage 中提供收到消息后相应的处理方法即可。(接收消息,并且更新UI)
2)在新启动的线程中发送消息
a.Message
Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。使用Message的arg1和arg2便可携带int数据,使用obj便可携带Object类型数据。
2.Handler
Handler顾名思义就是处理者的意思,它只要用于在子线程发送消息对象Message,在UI线程处理消息对象Message,在子线程调用sendMessage方法发送消息对象Message,而发送的消息经过一系列地辗转之后最终会被传递到Handler的handleMessage方法中,最终在handleMessage方法中消息对象Message被处理。
3.MessageQueue
MessageQueue就是消息队列的意思,它只要用于存放所有通过Handler发送过来的消息。这部分消息会一直存放于消息队列当中,等待被处理。每个线程中只会有一个MessageQueue对象,请牢记这句话。其实从字面上就可以看出,MessageQueue底层数据结构是队列,而且这个队列只存放Message对象。
4.Looper
Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中,然后每当MesssageQueue中存在一条消息,Looper就会将这条消息取出,并将它传递到Handler的handleMessage()方法中。每个线程只有一个Looper对象。
理解以上成员后,理解就很简单了。
子线程发送消息,主线程接收消息。