老李推荐:第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. Linux实战教学笔记14:用户管理初级(下)

    第十四节 用户管理初级(下) 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,用户查询相关命令id,finger,users,w,who,last,lastlog,gr ...

  2. JAVA对特殊的字符串进行html编码

    SourceURL:about:blank /** * Created by Administrator on 2016/9/22. */public class HtmlEncode { publi ...

  3. Angular控制器

    这里使用的是angular-1.0.1.min.js Angular的前端渲染 <div> <ul> <li ng-repeat="i in [1,2,3]&q ...

  4. 详细领悟ThreadLocal变量

    关于对ThreadLocal变量的理解,我今天查看一下午的博客,自己也写了demo来测试来看自己的理解到底是不是那么回事.从看到博客引出不解,到仔细查看ThreadLocal源码(JDK1.8),我觉 ...

  5. HTML 5入门知识(三)

    <canvas>标签 在网页中使用canvas元素,像使用其他HTML标签一样简单,然后利用JavaScript脚本调用绘图API,绘制各种图形.canvas拥有多种绘制路径.矩形.圆形. ...

  6. 前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象

    JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous). “同步模式”就是一个任务完成之后,后边跟着一个任务接着执行:程序的执行顺序和排列 ...

  7. Memcached【第二篇】高可用集群搭建

    第一步:准备 1. 架构信息 利用 magent 搭建 memcached 集群,实现性能的高可用. IP Port 主从 192.168.6.129 11211 主节点 192.168.6.130 ...

  8. wemall app商城源码Android数据的SharedPreferences储存方式

    wemall-mobile是基于WeMall的Android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android数据 ...

  9. 1112: [POI2008]砖块Klo

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1245  Solved: 426[Submit][Statu ...

  10. 【方法】Oracle用户密码含特殊字符时的登陆问题

    [方法]Oracle用户密码含特殊字符时的登陆问题 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它 ...