Handler介绍:
Hanlder是用来更新UI的一套机制,也是一套消息处理的机制,我们可以通过
它来发送和处理消息。Message对象:
消息Message是仅是一个数据结构,是信息的载体,它与队列机制是无关的,封装着要执行的动作和执行动作的必要信息,what, arg1, arg2, obj可以用来传送数据;而Message的回调则必须通过Handler来定义,为什么呢?因为Message仅是一个载体,它不能自己跑到目标MessageQueue上面去,它必须由Handler来操作,把Message放到目标队列上去,既然它需要Handler来统一的放到MessageQueue上,也可以让Handler来统一定义处理消息的回调。需要注意的是同一个Message对象只能使用一次,因为在处理完消息后会把消息回收掉,所以Message对象仅能使用一次,尝试再次使用时MessageQueue会抛出异常。
运行原理:
使用Handler时,Handler所在的线程必须有Looper存在,Handler在调用sendMessage时会把消息的target设为自己,然后加入到Looper中的消息队列中。在Looper.Loop()方法中,Looper从消息队列中得到一个消息后,会调用它的target的dispatchMesage函数,即最后又回到Handler的msg处理上来。
Handler使用post(Runnable)时原理与使用Message一样,就是将Runnable转换为Message而已。
总而言之,在子线程中更新UI的流程是:
2.在子线程中将更新操作封装在Message中,然后调用主线程Handler的SendMessage方法,将Message从子线程发送到主线程的消息队列中。
3.主线程的Looper.Loop()方法从消息队列中将Message取出并执行其中的方法,完成UI的更新操作。