一、Android为什么提供Handler消息机制
在Android中不允许子线程访问UI,Handler可以解决这个矛盾
因为Android的UI控件不是线程安全,如果并发访问必然会产生不可预期的状态。
Handler的主要作用就是将一个任务切换到指定线程中去执行,使用Handler我们就可以把访问UI的任务切换到主线程
二、简述Handler的工作原理
- Handler的运行需要底层MessagQueue和Looper的支撑,
- MessagQueue:消息队列。采用单链表的数据结构储存消息列表
- Looper:消息循环。以无限循环的形式去查找是否有新消息,有就处理消息,没有就等待着
- 线程是默认没有Looper的,要使用Handler必须要为线程创建Looper
UI线程即ActivityThread,默认可以使用Handler。因为ActivityThread被创建时初始化了Looper
- 那么Handler内部如何获取当前线程的Looper呢?这时候就要使用ThreadLocal
ThreadLocal的作用:在每个线程中储存数据
ThreadLocal可以在不同的线程中互不干扰的储存并提供数据,通过ThreadLocal可以轻松获取每个线程的Looper
- Handler循环系统创建完毕后,Handler、MessageQueue、Looper就可以协同工作了。通过Handler的send方法将一个Runnable投递到Looper中去处理
- 当send方法被调用时,它会调用MessageQueue的enqueueMessage方法将这个消息放在消息队列中
- Looper发现有新消息,就进行处理,最终消息中的Runnable或Handler的handleMessage方法被调用
- 由于Looper运行在创建Handler的线程中,所以Handler中的业务逻辑就被切换到Looper所在的线程中执行了
网友评论