安卓下的消息机制
来源:互联网 发布:mac版有360浏览器吗 编辑:程序博客网 时间:2024/06/04 19:56
1. 首先说说安卓中为什么要消息机制?
由于在主线程中在执行耗时操作的时候,会阻塞线程,抛出anr异常,这时,我们就需要创建一个子线程来执行耗时操作(如:查询数据库,网络请求等).而更新UI的操作必须在主线程中进行,这时就需要一种机制使得主线程和子线程进行通讯,消息 机制就产生了。
2. 消息机制实现原理?
当应用开启的时候,就会执行当前类所在的main()放法,在这个方法中,系统会自动的先后去调用Looper中的两个静态方法,prepareMainLooper()和loop()方法。
首先执行prepareMainLooper(),主要是为了创建一个Looper对象和消息队列 。 具体的实现步骤是,当执行prepareMainLooper()方法时,会去调用Looper中的prepare()方法,接着在prepare()方法中,会去执行set(new Looper())操作,即创建了一个Looper对象,而在Looper中的构造方法中,会先去创建一个消息队列MessageQueue,即可以理解为当前的looper对象管理了一个MessageQueue队列
接着执行Loop()方法,该方法作用可以理解为开启了一个主消息轮询器,从消息队列中依次取出每一条消息,直到当前队列中没有任何消息时,就会进行睡眠状态,直到下一条即时消息(即没有延时操作)的到来,才会唤醒当前线程,接着去监视当前消息队列。
3.子线程向主线程发送消息?
当在子线程中向主线程发送消息的时候,会依次调用sendMessageDelayed(..), sendMessageAtTime(..),将消息发送到消息对列中并排序。具体的排序规则则是:加入当前有优先级分别为2--4--6--8--9的消息在队列中, 这时发来一个优先级为7的消息,我们该如何插进去呢? 也许大家会说将6和8之间的”连线“,去掉,但是这样做的话,优先级为8的消息就不知道自己在队列中的那个位置了。正确的做法则是,现将优先级为7的消息指向8,然后再断开6和8,在断开的过程中,让6指向7,这样,消息就顺利的插入到了消息队列中去了。
4.Handler如何发送和处理消息?
在创建Handler的对象时,在其构造方法中会先去调用Looper中的一个静态方法mlooper方法,在mlooper()方法中会去返回一个looper对象(该对象是在应用开启的时候在主线程中创建的,上面已经具体描述了),拿到looper对象后,然后通过looper对象拿到消息队列. 当子线程通过Handler的对象发送消息时会到当前这个消息队列,主消息轮询器将从队列中取出消息调用dispatchMessage()方法进行分发,然后在dispatchMessage()方法中,调用handlerMessage()方法来处理当前消息。
- 安卓下的消息机制
- WTL的消息机制
- CBC的消息机制
- Windows的消息机制
- windows的消息机制
- Windows的消息机制
- MFC的消息机制
- Ogre的消息机制
- MFC的消息机制
- MFC 的消息机制
- Windows的消息机制
- MFC的消息机制
- MFC的消息机制
- Android的消息机制
- Android的消息机制
- Android的消息机制
- Windows的消息机制
- Android的消息机制
- 利用Solr搭建企业搜索平台之一-Solr运行
- Matlab各种排序函数
- static详解
- leetcode:Spiral Matrix II
- 11月份学习总结
- 安卓下的消息机制
- 利用SOLR搭建企业搜索平台 之二(中文分词)
- VC6.0MFC动态加载位图中出现的问题
- DNS递归和迭代解析
- 网络工具wget被发现存在安全漏洞(CVE-2014-4877)
- Android学习入门例子:打造Android版手机视频监控系统
- Matlab各种最值问题
- 利用SOLR搭建企业搜索平台 之三(配置文件)
- MVC浅入浅出