因为UI控件不是线程安全的所以不能在子线程中访问UI
为什么不加上锁机制:会让UI的访问逻辑变得复杂,其次会降低UI的访问效率因为锁机制会阻塞某些线程的执行
基于以上采用了单线程模型处理UI操作并使用Handler切换UI执行线程
- MessageQueue:
在looper的构造函数中创建
数据结构:名字是消息队列其实是一个单链表的数据结构存储消息队列(在插入和删除上比较有优势)
方法:
enqueuemessage:插入消息
next:读取并删除消息
- Looper:
创建looper
方法:quit(直接退出)和quitSafaly(messagequeue中的已有消息处理完才安全退出)
looper退出后Handler发送的消息会失败,send方法会返回false
线程默认没有looper,主线程创建时就会初始化looper
ThreadLocal:
用来存储不同线程中的数据,不同线程访问同一个ThreadLocal的get方法,ThreadLocal内部会从各自的线程中取出一个数组,然后再从数组中根据当前ThreadLocal的索引去查找对应的value值
set方法:
通过values方法获取当前线程中的ThreadLocal数据
get方法:
- Handler:
方法:
send和post(最终也是通过send完成)
内容来自《android开发艺术探索》
内容补充: