`
whotodo
  • 浏览: 168329 次
文章分类
社区版块
存档分类
最新评论

Android Monkey(二)

阅读更多
这次我们来讲一下,MonkeySourceNetwork.java.
这个类相对较大,里面有许多的内嵌类.(ps. 我不是写Java出身的,看到内嵌类就不符合我的审美习惯)
1.有一个MonkeyCommand的类,这是一个interface. *Command都是他的子类.
其中定义了一个很重要的方法:这个方法将string 类型的command转换为MonkeyEvent对象,并放入
commandQueue.
 MonkeyCommandReturn translateCommand(List<String> command, CommandQueue queue);
好了,首先MonkeyCommandReturn又是一个类,是命令执行成功还是失败的一个类.
commandQueue是实际上是一个interface,然后它的实现是在CommandQueueImpl这个类中.
实现了如下的方法:
 public void enqueueEvent(MonkeyEvent e) {
            queuedEvents.offer(e);
        }
将Event放入queueEvents队列中.而queueEvents是这样定义的:
private final Queue<MonkeyEvent> queuedEvents = new LinkedList<MonkeyEvent>();
无非就是一个LinkedList而已拉.
2.下面我在来说说MonkeySourceNetwork类中的方法:
private void translateCommand(String commandLine)
和上面的方法同名.实际上这个translateCommand是上面的封装.我们来RTFS:
List<String> parts = commandLineSplit(commandLine);
if (parts.size() > 0) {
MonkeyCommand command = COMMAND_MAP.get(parts.get(0));
if (command != null) {
MonkeyCommandReturn ret = command.translateCommand(parts,commandQueue);
COMMAND_MAP这是个什么东西呢?
private static final Map<String, MonkeyCommand> COMMAND_MAP = new HashMap<String, MonkeyCommand>();
看了没,是一个Map.以Command string作为Key, MonkeyCommand作为Value.这样的话,就建立了,
输入的命令和Command的关系。
static {
// Add in all the commands we support
COMMAND_MAP.put("flip", new FlipCommand());
COMMAND_MAP.put("touch", new TouchCommand());
COMMAND_MAP.put("trackball", new TrackballCommand());
COMMAND_MAP.put("key", new KeyCommand());
COMMAND_MAP.put("sleep", new SleepCommand());
COMMAND_MAP.put("wake", new WakeCommand());
COMMAND_MAP.put("tap", new TapCommand());
COMMAND_MAP.put("press", new PressCommand());
COMMAND_MAP.put("type", new TypeCommand());
COMMAND_MAP.put("listvar", new MonkeySourceNetworkVars.ListVarCommand());
COMMAND_MAP.put("getvar", new MonkeySourceNetworkVars.GetVarCommand());
}
但也不是所有的命令都放入COMMAND_MAP中.quit 和 done 就是例外,原因也很简单,没必要放进Map.
 再来分析下这条语句:MonkeyCommandReturn ret = command.translateCommand(parts,commandQueue);
首先,command已经是MonkeyCommand的sub class了.so 调用translateCommand将会表现出不同的行为.
例如,command假设为PressCommand.则translateCommand的表现为:
queue.enqueueEvent(new MonkeyKeyEvent(....))
每一个MonkeyEvent又都代表了一些对AP GUI错作.所以,也就是把操作放入了Queue.
okay.就这么多了.才不多这次就说这么多吧.我再附上我的手绘图,希望有帮助.Android Monkey(二) - 一切的阅读都是误读 - Allen小笔记Android Monkey(二) - 一切的阅读都是误读 - Allen小笔记
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics