在Android开发的多线程应用场景中,Handler十分常用,主要用作多线程通信。要弄清楚传递与处理机制就需要了解Handler、Message、MessageQueen、Looper、ThreadLocal这几个概念和整个流程。
相关概念
Handler - 消息的真正处理者, 具备获取消息、发送消息、处理消息、移除消息等功能;
Message -代表一个行为what或者一串动作Runnable的消息,每一个消息在加入消息队列时,都有明确的目标Handler;
MessageQueue - 以队列的形式对外提供插入和删除的工作, 其内部结构是以双向链表的形式存储消息的;
Looper - 是循环的意思,它负责从消息队列中循环的取出消息然后把消息交给Handler处理;
ThreadLocal - 是线程本地存储区(TLS),每个线程都有自己的私有的本地存储区域,不同线程之间彼此不能访问对方的TLS区域。ThreadLocal的作用是提供线程内的局部变量TLS,这种变量在线程的生命周期内起作用,每一个线程有他自己所属的值(线程隔离)。
整个流程
Handler通过sendMessage()发送Message到MessageQueue队列;
Looper通过loop(),不断提取出达到触发条件的Message,并将Message交给target来处理;
经过dispatchMessage()后,交回给Handler的handleMessage()来进行相应地处理。
注意:每个线程默认是无Looper的,在一个线程中使用Handler来收发消息时,需要先调用Lopper.prepare()进行创建对应的Looper,创建Handler后需要调用Looper.loop()来开启消息循环。一个线程只能有一个Looper,对应的只有一个MessageQueue。
问:为什么主线程不会因为Looper.loop方法造成阻塞?
答:因为Android 的是由事件驱动的,Looper.loop() 不断地接收事件、处理事件,每一个点击触摸或者说Activity的生命周期都是运行在 Looper.loop() 的控制之下。所以不存在主线程会被Looper.loop方法阻塞。如果 Looper.loop()被干掉了,应用也就挂掉了。
领取专属 10元无门槛券
私享最新 技术干货