android消息机制

来源:互联网 发布:dior fix it color 编辑:程序博客网 时间:2024/05/12 09:33

Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑。

Android的消息机制的主要作用:是将一个任务切换到某个指定的线程执行。

因为Android规定访问UI只能在主线程中进行,如果在子线程中访问UI,那么程序就会抛出异常。由于这一点限制,所以必须在主线程中访问UI。但是Android不建议在主线程中进行耗时操作,否则会导致程序太久无法响应而产生ANR。所以如果在工作线程从服务器中获取数据然后在UI中显示,就必须用到Handle。

系统为什么不允许在子线程中访问UI呢?这是因为Android的UI控件不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态。那么为什么系统不对UI控件的访问加上锁呢?缺点有两个:1.首先加上锁机制会让UI访问的逻辑变得复杂;2.锁机制会降低UI访问效率,因为所机制会阻塞某些线程的执行。

MessageQueue的工作原理

MessageQueue主要包含两个操作:插入和读取。读取操作本身会伴随着删除操作。插入和读取对应的方法分别为:enqueueMessage和next。其中enqueueMessage的作用就是往消息队列中插入一条消息,而next的作用是从消息队列中取出一条消息并将其从消息队列中移除。next方法是一个无限循环的方法,如果消息队列中没有消息,那么next方法一直阻塞在这里。当有新消息到来时,next方法会返回这条消息并将其从单链表中移除。

Looper的工作原理

Looper的作用其实就是不停的调用MessageQueue的next方法,如果有新消息就会立即处理,否则就一直阻塞在那里。在Looper的构造方法中它会创建一个MessageQueue。

Handler的工作需要Looper,没有Looper的线程就会报错。但是在主线程中创建Handler就不需要创建Looper,因为在主线程默认存在一个Looper,在程序的入口即main()方法中创建Looper。

创建Looper的方法:Looper.prepare(); Looper.prepareMainLooper()(这个方法主要是给主线程创建Looper使用,其本质也是prepare()方法来实现);

另外Looper提供了一个getMainLooper方法,通过他可以在任何地方取到主线程Looper。

Looper也是可以退出(quit和quitSafely)、quit是直接退出,quitSafely是设定一个退出标记,然后把消息队列的以有消息处理完毕后才完全地退出。所以在子线程中,如果手动为其创建了Looper,那么在所有的事情完成以后应该调用quit方法来终止消息循环,否则这个子线程就会一直处于等待的状态。

Looper中最重要的一个方法--loopr方法,只有调用了loop后,消息循环系统才会真正地起作用。loop方法是一个死循环,会不停的调用MessageQueue的next方法,跳出循环的唯一方法就是当next方法返回了null。当Looper的quit方法被调用时,就会调用MessageQueue的quit方法,next方法就会返回null。在next有返回值时(返回一个Message对象),Looper就会处理这条消息:msg.target.dispatchMessage(msg),msg.target是发送这条消息的Handler对象,这样这个消息就会最终交个它的dispatchMessage方法来处理。

Handler的工作原理

Handler的工作主要包含消息的发送和接收过程。消息的发送通过post的一系列方法以及send的一系列方法来实现,post的一系列方法最终也是通过send的一系列方法来实现。

send方法实际上就是消息放入消息队列中。而在Looper中取出这条消息后会调用Handler的dispatchMessage方法。在dispatchMessage方法中最终会调用handlerMessage方法。


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 月子里碰冷水了怎么办 月子手碰凉水了怎么办 月子里碰了冷水怎么办 顺产后下面会痛怎么办 产后肚子瘦不下来怎么办 出月子后臀部很疼怎么办 做月子时臀部疼怎么办 月子臀部大腿疼困怎么办 产后抱孩子腰疼怎么办 剖腹产后5年小肚子很大怎么办 压力大工作忙瘦了怎么办? 哺乳乳房一大一小怎么办 哺乳期乳房一大一小怎么办 上班之后奶少了怎么办 出了月子还流恶露怎么办? 剖腹产2年刀疤痒怎么办 刨宫产6天伤口痒怎么办 脸的皮肤油油的怎么办 狗狗子宫蓄脓怎么办 刮宫后子宫壁薄怎么办 产妇有痔疮怎么办很疼 二胎着床在剖腹产切口怎么办 刨腹产3月后怀孕怎么办 破腹产两年了肚子还是很大怎么办 抛妇产后肚子大怎么办 破腹产后想大便怎么办 破腹产后肚子硬怎么办 在月子里同房了怎么办 胃变大凸出来了怎么办 坐完月子脊背疼怎么办 月子过后脊背疼该怎么办 怀孕的时候牙疼怎么办 练瑜伽后弯腰疼怎么办 练完瑜伽腰椎疼怎么办 瑜伽开髋动作受伤怎么办 才学瑜伽教培上课紧张怎么办 瑜伽馆不给退费怎么办 脚运动后酸痛该怎么办 婴儿误吞拉链头怎么办 肠功能蠕动慢便秘怎么办 胃肠型和蠕动波怎么办