Android学习笔记--消息处理机制

温故而知新。


因为多线程修改UI界面会造成安全问题,所以安卓禁止在子线程中对UI进行操作(也有一种特殊情况可以在子线程中修改,就是界面刚加载,画布没有被系统锁定之前)。可是在主线程中做耗时操作又会影响用户的体验(在主线程中做耗时操作容发生ANR),所以我们在子线程中处理耗时操作,主线程处理UI更新。

可是主线程只有一个,子线程却很多,那么主线程和子线程之间应该如何进行交流呢?

安卓为我们提供了一套消息处理机制。


举个栗子。在现实生活中,我去一家很火的面店吃面条,由于人太多,进门的时候,厨师根本处理不过来就让服务员给我发了个带序号的牌子,坐下来等着。

那么在安卓的消息处理机制中,就是当程序员发出一个耗时操作指令的时候(这个指令就相当于是要去吃面条的我),由于主线程只有一个(也就是厨师只有一个),不可能说你一发出消息就马上处理(你刚到就给你面条吃是不可能的),因为要处理的指令很多(去吃东西的人很多)。那么系统中会自动创建出一个地方,有顺序的存储指令(服务员给你发号码牌让你排队),当主线程处理完最早发出的指令的时候(当厨师炒完一道面),就会开始执行下一条指令(炒下一道菜)。

再结合代码,一开始我们在主线程new一个Handler(厨师),系统会自动生成一个looper对象(自动分配一个服务员),调用sendMessage()方法(厨师说他很忙,让你去找服务员),looper主动调用looper.prepare()方法创建一个MessageQueue,然后将message按时间顺序存入一个链表中(服务员会主动将你带到一个排队的地方,再给你一个牌子让你等着)。looper会无限循环的调用looper.loop()方法(服务员会不停叫:下一个来拿面条吃),回调dispatchMessage()方法,然后用handleMessage()方法执行指令(被叫到的吃货去厨师拿面条吃)

大致过程如下图:


有个需要注意的点:

当在主线程中new Handler的时候系统会自动创建消息队列,不过在子线程中却不会,那么就需要手动调用Looper.prepare()方法创建队列。否则就会报错    Can't create handler inside thread that has not called Looper.prepare() 。


此文更多的是为了巩固自己已学知识,如有不正确的地方,欢迎指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值