【面向面试学习】吃烙饼就是Handler的真谛

173 阅读2分钟

很多Android初学者对于Handler、Message、MessageQueen、Looper之间盘根错节的关系,很难掌握,其实就是陷入了“不识庐山真面目,只缘身在此山中”的状况中。

网上大部分分析文章非常专业,深入源码,对于初学者来说很容易迷茫 我这里不说源码,咱往大面上说,往简单了说,细节先不管,从日常生活入手,给抽象的hander赋予生活气息,从而帮助理解。

场景一

  1. 妈妈和爸爸同时给你烙饼
  2. 每烙好一个就给你
  3. 你收到烙饼后,立即开吃
  4. 妈妈或者爸爸需要等你吃完才去烙下一张饼,因为总不能把饼直接放桌子上吧
  5. 有时候,都烙好了,妈妈爸爸排队等你吃,吃完一个走一个

场景二

  1. 问题来了,旁边总有人等你吃,你压力好大
  2. 你吃饼的速度远远赶不上他们烙饼的速度
  3. 由于你吃的慢,导致爸爸妈妈排队等你吃,他们没法烙更多的饼
  4. 核心问题就是:吃饼和烙饼的速度不一致,导致双方被拴在一条线上了

场景三

  1. 为了解决场景二的问题,怎么办
  2. 当然是准备一个盘子了
  3. 让爸妈把烙好的饼子放在盘子里即可,放完就可以转身回厨房继续烙
  4. 你吃完一个,就去盘子里拿新的
  5. 如果盘子里的饼被你吃光了,你就老老实实盯着盘子等着呗

联想

  • 这么一描述,这不就是典型的生产者消费者问题吗
  • 这种场景广泛存在Java世界里,典型的解决方案就是加一个缓冲区,一般是一种队列或者是列表

做一个映射

  • 你自己==Handler
  • 爸妈送饼到盘子==调用Handler的sendMessage
  • 吃饼==Handler里的dispatchMessage
  • 烙饼==Message
  • 盘子==MessageQueen
  • 不停的从盘子里拿饼=Looper 拿到之后就dispatchMessage吃掉他,没饼就等着