Android WebKit消息处理
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Android WebKit消息处理,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2158字,纯文字阅读大概需要4分钟。
内容图文
![Android WebKit消息处理](/upload/InfoBanner/zyjiaocheng/1165/1d6aa305cb4c45c1bab0c176087809ea.jpg)
前言
在Android API中,用WebView的形式向开发者提供WebKit的接口以及特性。WebView其实是对WebKit的封装以及扩展,在android4.4里面,已经WebKit已经换成Chromium(在后续博客中会对android4.4 的WebView/Chromium进行详细讲解)。
WebKit消息处理框架的搭建
整个WebKit主要分为2个线程,一个是Ui线程,也就是应用程序使用WebView所在的主线程,另一个WebCore线程。WebView的消息处理,主要是Ui线程和WebCore线程的交互。一部分Ui线程向WebCore发送的命令操作消息,例如LOAD_URL,另一部分是来自Ui的touch消息。
主要涉及到的类如图所示:
其中,WebViewClassic是WebView的Provider,或者说是delegate,凡是涉及到消息处理或者需要跟WebCore交互的接口,都是直接调用WebViewClassic的同名函数。
WebViewInputDispatcher就是用来处理Ui的touch事件的。后面会专门讲解WebKit的touch事件传递以及处理流程的。本章就不展开讲解了。
WebView的初始化
时序图如下:
上图其实就是WebView/WebKit的初始化流程,主要是对WebViewClassic, WebCore, WebViewInputDispatcher进行初始化,为WebKit资源请求前做准备。WebView构造函数中会调用createWebView,这个过程其实就是创建WebView的provider,实际返回的对象就是WebViewClassic,紧接着init初始化WebViewClassic,在WebViewClassic的init中会new WebViewCore(),之后对WebViewCore进行初始化,在WebViewCore自己初始化完毕之后,表明现在WebCore已经可以处理来自WebView的消息了,包括touch事件,此时WebViewCore会发送消息给WebViewClassic,也就是上图中看到的WEBCORE_INITIALIZED_MSG_ID,WebViewClassic收到此消息之后,就会初始化touch事件的分发器:WebViewInputDispatcher。这个流程结束之后,应用就可以通过WebView,loadUrl了。
从这个图中,我们看到,在WebCore的构造函数中会new WebCoreThread,这个线程就是上面提到的WebCore线程。到此为止,我们已经可以看到有2个线程了,一个是WebView所在的Ui线程,另一个就是WebCore线程。
那么WebKit的消息处理究竟怎么工作的呢?
在WebView中,消息在线程间的分发使用的是Handler。在WebKit的消息分发机制中的总共有三个Handler如下:
mPrivateHandler:
在WebViewClassic中创建,用来分发和处理UI相关消息,例如重绘,touch事件,另外就是负责跟WebCore线程交互。
sWebCoreHandler:
在WebCoreThread中间,主要负责WebViewCore初始化、WebViewCoreWatchDog心跳、WebCore线程优先级别调整。
mHandler:
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消息到对方的消息队列中去。
版权申明:
转载文章请注明原文出处,任何用于商业目的,请联系本人:hyman_tan@126.com
原文:http://blog.csdn.net/feiyinzilgd/article/details/19019413
内容总结
以上是互联网集市为您收集整理的Android WebKit消息处理全部内容,希望文章能够帮你解决Android WebKit消息处理所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。