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线程。
    具体调用过程见具体时序图(引自韦东山老师)

    需要具体调用时序图可以私信我
  • 相关阅读:
    C 运算符, 有符号数据运算,
    P1337 [JSOI2004]平衡点 / 吊打XXX 模拟退火
    [POI2011]Garbage 欧拉回路
    # bzoj2215: [Poi2011]Conspiracy 2-sat
    hdu1814 Peaceful Commission 2-sat
    2-sat相关复习
    #2718. 「NOI2018」归程 kruskal重构树
    JXOI2018守卫 区间DP
    [NOI1995]石子合并 四边形不等式优化
    3900: 交换茸角
  • 原文地址:https://www.cnblogs.com/lkq1220/p/6736312.html
Copyright © 2011-2022 走看看