2020-04-20

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 里的一个生命周期方法或回调方法被调用,你就可以在里面做自己的事情了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容