老李推荐:第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串

 

poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-84505200。

在第2节中我们看到了MonkeySourceNetwork是如何从Socket中获取MonkeyRunner发送过来的命令字串的,但是最后如何将它翻译成事件的代码我们还没有进行分析,因为在那之前我们还没有了解命令翻译类的相关知识。那么经过第3小节对命令翻译类的学习后,我们就可以继续往下分析MonkeySourceNetwork的getNextEvent中是如何翻译命令字串的了。

我们回看下第2小节,最后在获得命令字串之后调用的是MonkeySourceNetwork类的translateCommand方法:

653   private void translateCommand(String commandLine)

654   {

655     Log.d("MonkeyStub", "translateCommand: " + commandLine);

656     List<String> parts = commandLineSplit(commandLine);

657     if (parts.size() > 0) {

658       MonkeyCommand command = (MonkeyCommand)COMMAND_MAP.get(parts.get(0));

659       if (command != null) {

660         MonkeyCommandReturn ret = command.translateCommand(parts, this.commandQueue);

661         handleReturn(ret);

662       }

663     }

664   }

代码6-4-1 MonkeySourceNetwork - translateCommand

  • 653行: 传进来的参数就是一个命令字串。 通过” 表3-3-1 命令字串和对应的命令翻译类参照表”我们可以看到一个命令字串如果带有参数的话它的形式可能是这样的“type line”
  • 656行: 为了方便使用该命令,通过调用commandLineSplit方法把命令字串转换成一个列表分别把命令,每个参数都独立保存在列表里面。这个方法无非就是根据空格等把命令和参数分解出来,所以就不跟踪进去分析了
  • 658行: 将命令和参数分离分别存放到列表后,根据命令去” 代码3-1-2 MonkeySourceNetwork - COMMAND_MAP”所描述的COMMAND_MAP去查找对应的命令翻译类实例。以上面的”touch x y”命令字串为例,就是根据”type”去COMMAND_MAP中查找,对应的将是这一行:

461         COMMAND_MAP.put("type", new TypeCommand());

也就是说找到的对应的命令翻译类是TypeCommand

  • 660行:调用命令翻译类的translateCommand方法来翻译命令列表,注意这里传进去的参数除了命令字串列表之外还有一个MonkeySourceNetwork的成员变量commandQueue,也就是我们一直说的命令队列,传进去的目的就是在解析命令的过程中如果需要创建一个对应事件实例的话,那么创建完后就直接往这个同一个的命令队列里面丢就行了

那么往下我们就看下上面的TypeCommand的translateCommand方法是如何实现的:

294         public MonkeyCommandReturn translateCommand(List<String> command,

295             CommandQueue queue) {

296             if (command.size() == 2) {

297                 String str = command.get(1);

298

299                 char[] chars = str.toString().toCharArray();

300

301                 // Convert the string to an array of KeyEvent's for

302                 // the built in keymap.

303                 KeyCharacterMap keyCharacterMap = KeyCharacterMap.

304                         load(KeyCharacterMap.VIRTUAL_KEYBOARD);

305                 KeyEvent[] events = keyCharacterMap.getEvents(chars);

306

307                 // enqueue all the events we just got.

308                 for (KeyEvent event : events) {

309                     queue.enqueueEvent(new MonkeyKeyEvent(event));

310                 }

311                 return OK;

312             }

313             return EARG;

314         }

代码6-4-2 TypeCommand - translateCommand

  • 299-299行: 在命令字串列表中取得type命令的参数line,也就是一大串需要输入的字符串了。然后把该字符串每个字符拆散开来建立一个字符数组chars,因为下面获得每个字符对应的系统按键事件KeyEvent的的方法接受的参数就是字符数组
  • 304-305行: KeyCharacterMap的getEvents方法官方的解析是用来根据提供的字符数据流生成一个对应按键事件数组,所以这里的意义就是为输入字串的每一个字符都产生一个按键事件,然后组织成一个按键事件队列返回给events变量。这里需要提下的是KeyEvent在Android系统中代表一个按键事件,它内部拥有的每个按键对应的值以及按键对应的Action如ACTION_DOWN/ACTION_UP等等的定义
  • 308-309行: 根据按键事件创建一个MonkeyKeyEvent实例,并把该事件放到传进来的命令队列里面等待执行

这一小节结合TypeCommand这个命令翻译类我们看到了MonkeySourceNetwork从网络获得一个字串命令后是如何通过调用自身的translateCommand方法来解析出里面的命令和参数,然后根据命令来查找COMMAND_MAP来获得对应的命令翻译类实例,最后通过命令翻译类的translateCommand来根据命令字串创建对应的MonkeyEvent的并把它加入到命令队列中。

在下一小节我们就去学习下这个MonkeyEvent和命令队列的相关知识。

老李推荐:第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串的更多相关文章

  1. 老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件

    老李推荐:第14章9节<MonkeyRunner源码剖析> HierarchyViewer实现原理-遍历控件树查找控件   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员 ...

  2. 老李推荐:第14章5节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态

    老李推荐:第14章5节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态   poptest是国内唯一 ...

  3. 老李推荐:第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer

    老李推荐:第14章6节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-启动ViewServer   poptest是国内唯一一家培养 ...

  4. 老李推荐:第14章3节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer实例化

    老李推荐:第14章3节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer实例化 poptest是国内唯一一家培养测试开发工程师的培 ...

  5. 老李推荐: 第14章2节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer架构概述

    老李推荐: 第14章2节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer架构概述   HierarchyViewer库的引入让M ...

  6. 老李推荐:第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程

    老李推荐:第14章1节<MonkeyRunner源码剖析> HierarchyViewer实现原理-面向控件编程VS面向坐标编程   poptest是国内唯一一家培养测试开发工程师的培训机 ...

  7. 老李推荐:第8章7节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-小结

    老李推荐:第8章7节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-小结   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...

  8. 老李推荐:第8章5节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行测试脚本

    老李推荐:第8章5节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行测试脚本   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化 ...

  9. 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结

    老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结   本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...

  10. 老李推荐:第8章1节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行环境初始化

    老李推荐:第8章1节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行环境初始化   首先大家应该清楚的一点是,MonkeyRunner的运行是牵涉到主机端和目 ...

随机推荐

  1. Log4net 日志记录配置信息

    <log4net> <!--配置日志的级别,低于此级别的就不写到日志里面去 OFF.FATAL.ERROR, WARN, INFO, DEBUG, ALL --> <ro ...

  2. JVM内存分配与回收策略

    对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配. 当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC. Minor GC:新生代GC,指发生在新生代的垃圾收集动作 ...

  3. pl/sql 导出oracle表结构

    tools->export tables 是导出表结构还有数据 tools->export user objects是导出表结构   可以用tools->export tables ...

  4. collectionView布局

    关于 collectionView的layout布局方法: 设置cell的间距,行间距,组与组之间的间距,都是在layout里面来设置. 包括,滚动方向. -(void)prepareLayout [ ...

  5. jQuery给CheckBox全选与不全选

    $(function(){ $("#checkAll").click(function() {//全选 $('input[name="DATA"]').prop ...

  6. linux下keepalived 安装配置

    keepalived是一个类似于layer3, 4 & 7交换机制的软件,也就是我们平时说的第3层.第4层和第7层交换.Keepalived的作用是检测web服务器的状态,如果有一台web服务 ...

  7. 从源码解析TreeMap

    上篇文章我们介绍了HashMap集合,这是一个键值对集合,可以高效的按照键查找数值.但是它有一个缺陷:数据如果是无序的可以是很高效的,但是如果数据需要排列有顺序就不适合了.本篇将要介绍的一个集合是树集 ...

  8. ORM 实现数据库表的增删改查

    这次通过反射技术来实现一下数据库表的增删改查对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 注:引用时约束了以下几点: 数据 ...

  9. 前端面试题总结:HTML5,JS,CSS3,兼容性。

    1. 请写出至少20个HTML5标签 <article><aside> <audio><video> <canvas><datalis ...

  10. wemall doraemon中Android app商城系统向指定URL发送GET方法的请求代码

    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...