标签:
在第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
461 COMMAND_MAP.put("type", new TypeCommand());
也就是说找到的对应的命令翻译类是TypeCommand
那么往下我们就看下上面的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
这一小节结合TypeCommand这个命令翻译类我们看到了MonkeySourceNetwork从网络获得一个字串命令后是如何通过调用自身的translateCommand方法来解析出里面的命令和参数,然后根据命令来查找COMMAND_MAP来获得对应的命令翻译类实例,最后通过命令翻译类的translateCommand来根据命令字串创建对应的MonkeyEvent的并把它加入到命令队列中。
在下一小节我们就去学习下这个MonkeyEvent和命令队列的相关知识。
注:更多文章请关注公众号:techgogogo或个人博客http://techgogogo.com。当然,也非常欢迎您直接微信(zhubaitian1)勾搭。本文由天地会珠海分舵原创。转载请自觉,是否投诉维权看心情。
第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串
标签:
原文地址:http://blog.csdn.net/zhubaitian/article/details/50212579