转自 :http://www.fenesky.com/blog/2014/02/11/Android-WebKit-MsgHandle.html
在Android API中,用WebView的形式向开发者提供WebKit的接口以及特性。WebView其实是对WebKit的封装以及扩展,在android4.4里面,已经WebKit已经换成Chromium(在后续博客中会对android4.4 的WebView/Chromium进行详细讲解)。
整个WebKit主要分为2个线程,一个是Ui线程,也就是应用程序使用WebView所在的主线程,另一个WebCore线程。WebView的消息处理,主要是Ui线程和WebCore线程的交互。一部分Ui线程向WebCore发送的命令操作消息,例如LOAD_URL,另一部分是来自Ui的touch消息。
主要涉及到的类如图所示:
时序图如下:
从这个图中,我们看到,在WebCore的构造函数中会new WebCoreThread,这个线程就是上面提到的WebCore线程。到此为止,我们已经可以看到有2个线程了,一个是WebView所在的Ui线程,另一个就是WebCore线程。
那么WebKit的消息处理究竟怎么工作的呢? 在WebView中,消息在线程间的分发使用的是Handler。在WebKit的消息分发机制中的总共有三个Handler如下:
在WebViewClassic中创建,用来分发和处理UI相关消息,例如重绘,touch事件,另外就是负责跟WebCore线程交互。
在WebCoreThread中间,主要负责WebViewCore初始化、WebViewCoreWatchDog心跳、WebCore线程优先级别调整。
WebCore线程消息循环最主要的handler。任何需要调用WebCore接口的,都需要通过mHandler send到WebCore线程中去。 在EventHub的transferMessages()中被new出来的,由于transferMessages()实在WebViweCore的initialize()中被调用的,所以,EventHub的mHandler也是在WebCore线程中。
Ui线程第一次向WebCore线程发送的消息,并没有直接被分发到WebCore线程中去。而是被缓存在WebViewCore中的mMessages list中,因为有可能在WebKit的消息处理框架还未初始化完毕,Ui线程就已经开始向WebCore线程发送消息了。所以,当WebViewCore最后初始化完毕之后,会调用transferMessages(),在transferMessages中将mMessages中的消息通过mHandler全部send到WebCore线程中去。
到这里已经应该很明白了:
Ui线程的消息通过WebViewClassic的mPrivateHandler处理。WebCore线程的消息通过EventHub的mHandler和WebViewCore的sWebCoreHandler处理。各个Handler之间可以相互send消息到对方的消息队列中去。