不可描述的Handler -_-
2017-10-18 本文已影响0人
markchan
一. Handler是什么
Handler是Android给开发者提供用来用来更新UI的一套机制, 也是一套消息处理机制, 开发者可以发送消息, 也可以通过它处理消息
二. 为什么要用Handler
Android在设计的时候, 就封装了一套消息创建、传递、处理机制. 如果不遵循这样的机制就没有办法更新UI消息, 就会抛出异常信息
三. 怎么使用Handler
sendMessage();
sengMessageDelayed();
post(Runnable);
postDelayed(Runnable, long);
四. Handler的组成
- Handler
封装了消息的方法(主要包括消息发送给谁), 将消息发送给Looper - Looper
- 内部包含一个消息队列,也就是MessageQueue, 所有的Handler发送的消息都走向这个消息队列
- Looper.loop()方法, 就是一个死循环, 不断地从MessageQueue中取消息, 如有消息就处理消息, 没有消息就阻塞
- MessageQueue
就是一个消息队列, 可以添加消息, 并处理消息
五. Handler的原理
Handler内部会跟Looper进行关联, 也就是说在Handler内部可以找到Looper, 找到Looper也就找到了MessageQueue, 在Handler中发送消息,
其实就是向MessageQueue队列中发送消息
思考: Android为什么要设计只能通过Handler机制更新UI?
最根本的目的是解决多线程并发问题
假设一个场景: 在一个Activity当中, 有多个线程去更新UI
问题一: 更新UI时并且都没有进行加锁处理, 那么会产生什么样的问题 -- 更新界面错乱
问题二: 如果对更新UI的操作都进行加锁处理的话, 又会产生什么样的问题 -- 性能下降
基于对以上问题的考虑, Android给开发者提供了一套更新UI的机制,
我们只需遵循这样的机制就可以了; 根本不用去关心多线程的问题, 所有更新UI的操作, 都要在主线程的消息队当中去轮询处理的
总结
- Handler负责发送消息, Looper负责接收Handler发送的消息, 并直接把消息回传给Handler
- MessageQueue就是一个存储消息的容器