android 事件机制初探

由于android中的view操作不是线程安全的(线程安全的方法或实例,可以在多个线程使用的情况下不出错),所以android中使用了handler的机制。通过handler,可以将各个线程中的更新ui的请求,收集到ui线程进行处理。这其中涉及到的概念包括handler, messagequeue, looper和thread。如果把这一过程比喻成工厂车间,那么message是一个个待加工处理的元件,looper是传送带,thread是为这个传送带供能的发动机,messagequeue则是处在传送带上的那一段message。处理完之后,message会通过dispatchMessage分发。

handler操作有两种方法,一是用handler.sendMessage(msg), 二是用handler.post(runnable)。两种方法有很多相似和相关之处。sendMessage系列的方法有三个,分别是sendMessage(msg), sendMessageDelayed(msg, millis), sendMessageAtTime(msg, millis), 其中第一个调用了第二个,第二个调用了第三个。第一个是直接发送message,所以将第二个方法里面的延迟时间设置为0。第三个方法中的时间,则是系统的绝对时间。而第三个方法有一个返回值,是一个enqueueMessage()的方法,目的就是讲message放入消息队列中。而handler操作的post方法,则是在其内先构造了一个message,然后将message.callback设置为此runnable,再调用了一个sendMessageDelayed()方法。

说到message的获取,也有三种方法,分别是用new 构造, handler.obtainMessage(), Message.obtain(),三种,其中后两者其实是一样的,第二个方法内部调用了第三个message的静态方法。

handler在创建的时候是自动与所在线程进行绑定的,而looper则不然。要绑定l过ooper,关键是两个方法:looper.prepare(), looper.loop(). 之前遇到过一次,在一个新创建的线程中使用toast, 结果因为没有绑定并启动looper而出错。looper与thread必须是一一对应的,如果在一个thread中试图绑定两个looper,也会报错。并且它们两者相互绑定,具体操作逻辑要看looper的源码。

原文地址:https://www.cnblogs.com/jason31/p/9518747.html