很多Android初学者对于Handler、Message、MessageQueen、Looper之间盘根错节的关系,很难掌握,其实就是陷入了“不识庐山真面目,只缘身在此山中”的状况中。
网上大部分分析文章非常专业,深入源码,对于初学者来说很容易迷茫 我这里不说源码,咱往大面上说,往简单了说,细节先不管,从日常生活入手,给抽象的hander赋予生活气息,从而帮助理解。
场景一
- 妈妈和爸爸同时给你烙饼
- 每烙好一个就给你
- 你收到烙饼后,立即开吃
- 妈妈或者爸爸需要等你吃完才去烙下一张饼,因为总不能把饼直接放桌子上吧
- 有时候,都烙好了,妈妈爸爸排队等你吃,吃完一个走一个
场景二
- 问题来了,旁边总有人等你吃,你压力好大
- 你吃饼的速度远远赶不上他们烙饼的速度
- 由于你吃的慢,导致爸爸妈妈排队等你吃,他们没法烙更多的饼
- 核心问题就是:吃饼和烙饼的速度不一致,导致双方被拴在一条线上了
场景三
- 为了解决场景二的问题,怎么办
- 当然是准备一个盘子了
- 让爸妈把烙好的饼子放在盘子里即可,放完就可以转身回厨房继续烙
- 你吃完一个,就去盘子里拿新的
- 如果盘子里的饼被你吃光了,你就老老实实盯着盘子等着呗
联想
- 这么一描述,这不就是典型的生产者消费者问题吗
- 这种场景广泛存在Java世界里,典型的解决方案就是加一个缓冲区,一般是一种队列或者是列表
做一个映射
- 你自己==Handler
- 爸妈送饼到盘子==调用Handler的sendMessage
- 吃饼==Handler里的dispatchMessage
- 烙饼==Message
- 盘子==MessageQueen
- 不停的从盘子里拿饼=Looper 拿到之后就dispatchMessage吃掉他,没饼就等着