1、Handler的定义:web
Handler主要用于接收子线程发送过来的数据, 并用此数据配合主线程进行UI的更新。并发
当应用程序启动时,Android首先会开启一个主线程 (UI线程),主线程主要为管理界面中的UI控件,进行事件的分发,比如如,你要点击一个 Button控件,Android就会经过此Buttond的监听器分发事件到此Button上,以此来响应你的操做。若是此时是一个须要耗时长的操做,例如:联网读取数据,或者读取本地较大的一个文件的时候,就不能把这些操做放在主线程当中了,若是被放在主线程中的话,界面会出现假死现象,若是5秒钟尚未完成的话,会收到Android系统的一个错误提示“强制关闭”。这个时候就须要把这些耗时的操做,放在一个子线程当中了,由于子线程可能会涉及到UI的更新,当新线程中有涉及到操做UI的操做时,就会对主线程产生危险,所以,Android提供了Handler做为主线程和子线程的纽带。也就是说,更新UI只能在主线程当中进行更新,在子线程中操做是危险的。oop
因为Handler是运行在主线程当中(UI线程中),它与子线程主要是经过Message对象来传递数据,这个时候,Handler就承担着接收子线程传过来的(子线程用sedMessage()方法传递)Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。post
注意:Handler 对象初始化后,就默认与对它初始化的进程的消息队列绑定,所以能够利用Handler所包含的消息队列,制定一些操做的顺序。spa
2、Handler的主要做用线程
1. 传递Message,用于接收子线程发送过来的数据, 并用此数据配合主线程更新UI。指针
在Android中,对于UI的操做一般须要放在主线程中进行操做。若是在子线程中有关于UI的操做,那么就须要把数据消息做为一个Message对象发送到消息队列中,而后,由Handler中的handlerMessge()方法处理传过来的数据信息,并操做UI。固然,Handler对象是在主线程中初始化的,它须要绑定在主线程的消息队列中。orm
类sendMessage(Message msg)方法实现发送消息的操做。在初始化Handler对象时重写的handleMessage()方法是用来来接收Messgae并进行相关操做的。对象
2. 传递Runnable对象,用于经过Handler绑定的消息队列,安排不一样操做的执行顺序。队列
Handler对象在进行初始化的时候,会默认的自动绑定消息队列。利用类post方法,能够将Runnable对象发送到消息队列中,按照队列的机制按顺序执行不一样的Runnable对象中的run方法。
3、Handler的一些特色
handler能够分发Message对象或Runnable对象到主线程中,每一个Handler实例,都会被绑定到建立它的线程中(通常是位于主线程)。
Handler中分发消息的一些方法:
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上post类方法容许你排列一个Runnable对象到主线程队列当中;
sendMessage类方法,容许你安排一个带数据的Message对象到队列中。
注意:
默认状况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper)、Handler(Looper looper, Handler.Callback callback) 能够指定线程),同时一个消息队列能够被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你能够再起若干个 Handler来处理)。在实例化Handler的时候,Looper能够是任意线程的,只要有Handler的指针,任何线程也均可以 sendMessage。Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,因此消息的处理是阻塞形式的(handleMessage()方法里不该该有耗时操做,能够将耗时操做放在 其余线程执行,操做完后发送Message(经过sendMessges方法),而后由handleMessage()更新UI)。