handler在Android中使用频繁,具体作用就是调度Runnable和Message对象,让他们被执行,而执行的操作是放在不同线程中的。
对于消息循环的机制,分为Handler,Message,MessageQueue,Looper四个部分,一般来说是handler发送Message,message被发送到MessageQueue中,然后通过looper对消息进行整理,例如查看消息队列中是否有新消息,最后再由handler处理消息。
打个比方,把消息机制当成一个垃圾分拣站,一条条消息代表了一件件垃圾,而handler表示垃圾车,由垃圾车把垃圾运到了垃圾站里,而垃圾站则是代表MessageQueue,垃圾站中主要就只有两个操作,一个是送进来,一个是送出去;至于looper表示的是过滤器,把垃圾分类,并查看是否有新的垃圾进来,有的话则工作,没有就放在那待机。最后操作完之后,再把分配好的垃圾通过handler垃圾车运输出去。
简单的举个例子,弄清楚消息的内部机制,然后再具体了解handler的作用。
一个完整的消息系统建立完成之后,剩下的事情基本上都是handler的工作,handler发送消息和取出消息派发两种。一般来说发送消息有两种方法。
send和post。
我们一般称send的Message为消息,其实post中Runnable也表示消息回调。通常post是将消息加入到消息队列中,并不立即执行,例如postDelay(),而send消息是立即执行,等待消息执行完才返回,例如sendMessage()。但是不管是post或者send都是将消息放入到消息队列中,然后立即返回,等待消息循环时获取消息被执行,所以两者的执行时间差别是在消息循环获取消息时产生的。
另外一般来说handler在主线程中创建,会自动绑定主线程。
当new Handler()发生在主线程,handler.post(Runnable runnable)执行的话,Runnable中的run方法会在特定的时间在主线程执行,这样可以防止ui操作在子线程执行。
handler.sendMessage()通常需要在new Handler()中重写handlerMessage方法,对发送的Message进行处理,如果有需要的话由msg.arg1、msg.arg2、msg.obj携带数据,在handlerMessage中对这些数据进行操作。
给自己记录,方便忘记基础理解~