在第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和命令队列的相关知识。

注:很多其它文章请关注公众号:techgogogo或个人博客http://techgogogo.com。当然,也很欢迎您直接微信(zhubaitian1)勾搭。

本文由天地会珠海分舵原创。转载请自觉,是否投诉维权看心情。

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

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

    老李推荐:第6章4节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-翻译命令字串   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自 ...

  2. 第6章1节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览

    在上一章中我们有简要的介绍了事件源是怎么一回事.可是并没有进行详细的描写叙述.那么往下的这几个小节我们就须要把这方面的知识给补充完整. 这一节我们先主要环绕MonkeySourceNetwork这个事 ...

  3. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用

    老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用   上一节我们描述了monkey的命令处理入口函数run是如何调用optionP ...

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

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

  5. 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例

    老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...

  6. 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列

    老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列   事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些 ...

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

    老李推荐:第6章5节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-事件   从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有 ...

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

    老李推荐:第6章3节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令翻译类   每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行 ...

  9. 老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串

    老李推荐:第6章2节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-获取命令字串   从上一节的描述可以知道,MonkeyRunner发送给Monkey的命令 ...

随机推荐

  1. caioj1442:第k小的数Ⅱ

    [传送门:caioj1442] 简要题意: 给出n个点,每个点都有一个权值,m个操作,操作有两种:第一种是询问l到r的第k小的值,然后输出这个值,第二种是将第x个点的值改为k 题解: 又是一道主席树的 ...

  2. legend---六、php脚本变量的生命周期是怎样的

    legend---六.php脚本变量的生命周期是怎样的 一.总结 一句话总结:应该是脚本结束变量的生命周期就完了 1.外部js找不到元素是怎么回事? 1 function myDailyTaskFin ...

  3. POJ Euro Efficiency 1252

    Euro Efficiency Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4109   Accepted: 1754 D ...

  4. 如何在VMware中创建虚拟机

    今天给大家分享如何在VMware中创建虚拟机,具体的教程如下.在这里小编提前下载了Ubuntu14.04桌面系统,为后面在虚拟机中安装Ubuntu14.04桌面系统做准备. 1.从官网上或者直接百度上 ...

  5. Flex之柱状图实例

    Flex之柱状图实例 <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns ...

  6. Felx之菜单导航

    Felx之菜单导航 环境搭建:MyEclipse 6.5+Flex Builder 3 Plug-in <?xml version="1.0" encoding=" ...

  7. Java main方法中的String[] args

    -- Java 命令行参数 -- 关于其中的args以及public static / static public Java 命令行参数 前面已经看到多个使用Java数组的示例,每一个Java应用程序 ...

  8. 【J-meter】参数及相应数据中文显示乱码问题

    参考资料: http://www.51testing.com/html/00/130600-1360743.html http://www.cnblogs.com/fengpingfan/p/5851 ...

  9. Linux 桌面玩家指南:18. 我对 Docker 的使用的学习心得

    原文:Linux 桌面玩家指南:18. 我对 Docker 的使用的学习心得 特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记 ...

  10. 转:IOS推送代码

    实例:调用方法:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary ...