Handler 机制简介
一套Android 消息传递机制/异步通信机制
1.作用 :在多线程应用的场景中,将工作线程中需更新UI 的操作信息,传递到UI主线程,从而实现工作线程对UI的更新处理,最终实现异步消息的处理。
工作线程--------Handler --------主线程
2.为什么要用消息传递机制
多个线程并发更新UI的同时,保证线程安全。
将工作线程需更新UI的消息传递到主线程,使主线程根据工作线程的需求更新UI。
3.相关概念
Handler
Message
Message Queue
Looper
4.使用方式
分为两种:Handler.sendMessage(),Handler.post()
方式一:Handler.sendMessage():在该方式的使用中,又分为两种:新建Handler 子类,匿名子类
5.具体介绍
Looper 在创建时会新建一个MessageQueue,通过prepare方法可以为Handler创建一个Looper
总结
应用启动时会启动Ui线程也就是主线程 ActivityThread ,在ActivityThread 的main 方法中会调用Looper.prepareMainLooper()和Looper.loop() 启动Looper.
Looper 启动时会创建一个MessageQueue实例,并且只有一个实例,然后不断从MessageQueue 中获取消息,无则阻塞等待消息,有则调用 msg.target.dispatchMessage(msg) 处理消息
我们在使用Handler时,需要先创建Handler 实例,Handler 在创建时会获取当前线程关联的Looper实例和Looper 中的消息队列MessageQueue.然后在发送消息时会自动给Message 设置target 为Handler本身,并把消息放入MessageQueue,由Looper处理。Handler 在创建时会重写handlerMessage 方法
简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce()方法里,详情见Android消息机制1-Handler(Java层),此时主线程会释放CPU资源进入休眠状态,直到下个消息到达或者有事务发生,通过往pipe管道写端写入数据来唤醒主线程工作。这里采用的epoll机制,是一种IO多路复用机制,可以同时监控多个描述符,当某个描述符就绪(读或写就绪),则立刻通知相应程序进行读或写操作,本质同步I/O,即读写是阻塞的。所以说,主线程大多数时候都是处于休眠状态,并不会消耗大量CPU资源。
假设没有可用事件就会通过 epoll 来等待,拿到事件后就会通过 Handler 进行派发,派发的最终结果就是你的 Activity 或其他 components 里的一个生命周期方法或回调方法被调用,你就可以在里面做自己的事情了。