zoukankan      html  css  js  c++  java
  • Android系统--输入系统(七)Reader_Dispatcher线程启动分析

    Android系统--输入系统(七)Reader_Dispatcher线程启动分析

    1. Reader/Dispatcher的引入

    对于输入系统来说,将会创建两个线程:

    • Reader线程(读取事件)

    • Dispatcher线程(分发事件)

    2. Reader/Dispatcher的创建

    我们知道在Android系统中,都普遍按照面向对象的思想来编写程序,对于问题,Android一般都是创建一个类去解决,在输入系统中,有两个线程,对于这两个线程,Android系统为这两个线程创建两个类,分别为InputReaderThread类、InputDispatchThread类,类下面都会实例化对象,分别为mReaderThread、mDispatchThread,他们主要完成创建一个线程,实现循环操作。在循环体操作中,需要调用另外一个对象mReader、mDispatch的相关函数。

    3. 引入EventHub类

    • EventHub类:可以接入多个设备

      • 鼠标

      • 键盘

      • 触摸屏

    • 实例化对象:mEventHub -- 实现检测、处理多个设备

    4. 引入InputManager类

    • 由于下层实现过于复杂,故对上一层应用来说需将其封装,故引入InputManager类(输入系统管理者)

    • 该实例化对象:mInputManager

      • InputReaderThread类

      • InputDispatchThread类

      • EventHub类

    5. Java层

    • 当Java层访问InputManager类,则对其再次封装,提供NativeInputManager类作为本地实现

    • 其实例化对象:im

    6. Android输入系统类关系框图

    7. Android输入系统函数调用过程

    • 创建线程

      • 创建NativeInputManagerd对象

      • 最终导致创建InputManager对象

      • 进而创建Reader线程、Dispatcher线程

    • 启动线程

      • 分发事件(该线程先启动)

      • 读取事件

    补充:先启动Dispatch线程的原因:为了保证读取到的事件能够被分发。如果先启动Reader线程,当Dispatch线程还未启动时,读取到的事件将被丢弃。故先启动Dispatch线程,后启动Reader线程。
    具体调用过程见具体时序图(引自韦东山老师)

    需要具体调用时序图可以私信我
  • 相关阅读:
    node.js
    Ajax常见面试题
    CF932E Team Work
    斯特林数
    UOJ #62. 【UR #5】怎样跑得更快
    洛谷 P4593 【[TJOI2018]教科书般的亵渎】
    洛谷 P4321 【随机漫游】
    洛谷 P4707 【重返现世】
    洛谷 P3175 [HAOI2015]按位或
    CF Gym101933K King's Colors
  • 原文地址:https://www.cnblogs.com/lkq1220/p/6736312.html
Copyright © 2011-2022 走看看