Android 基础组件

Android 消息机制 Handler

2021-01-10  本文已影响0人  科技猿人

Read The Fucking Source Code

消息机制模型:

源码阅读心得:

消息机制的分层与解耦:
Java层总结:
Native层总结:

Handler的通俗解释

Handler、Thread和HandlerThread的差别

问题思考

Android如何保证在请求绘制流程过程中,不会因为其他消息处理事件的阻塞,导致Vsync刷新信号的处理延时?

  • 这其实就是Handler如何做到线程优先级的问题。我们来跟进一下绘制流程的处理。
    1. 页面请求绘制流程刷新,会调用View的 requestLayout / invalidate 方法。
    1. 最终会调入到ViewRootImpl的 scheduleTraversals 方法。
    1. 在 scheduleTraversals 方法中,首先在Handler消息队列中插入同步屏障。
    1. 然后在 scheduleTraversals方法中向Choreographer(Vsync处理引擎)注册Vsync刷新信号回调。
    1. 在Choreographer中,如果有跨线程通信,那么都会用异步消息,并且放在消息队列头部,消息不会堵塞,优先处理。
    1. DisplayEventReceiver接收到native侧的调用 dispatchVsync(),然后通过跨线程,将onVsync()转到doFrame()。
    1. doFrame()已经在主线程中了,通过回调 scheduleTraversals 在 Choreographer 注册的回调Runnable。
    1. 返回ViewRootImpl中注册了Vsync刷新信号回调的Runnable中,会走到 doTraversal 。
    1. 在doTraversal中,移除同步屏障,然后执行真正的绘制分发流程 performTraversals(绘制流程分发总方法)。
    1. 等待绘制流程处理结束,才会进行下一个消息的轮询,这样就保证了绘制流程的高优先级线程处理。
    1. 设置同步屏障是hide方法,只给系统来用,所以设计初衷就是保证系统的某些操作要高优先级。
    1. 线程的高优先级需要两个必不可少的条件 = 同步屏障 + 异步消息。

小编的扩展链接

《Android 基础组件 全家桶》

上一篇 下一篇

猜你喜欢

热点阅读