老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串...
老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串
从上一节的描述可以知道,MonkeyRunner发送给Monkey的命令是以字符串的形式交互的,那么事件处理的第一步当然是先去获得MonkeyRunner发送过来的字串命令了。
在事件源MonkeySourceNetwork初始化的时候构造函数会创建一个ServerSocket来监听来自客户端的链接和数据,但这个时候客户端并不能真正实现和服务端通信,因为该ServerSocket尚处于阻塞状态。既然ServerSocket是MonkeySourceNetwork的构造函数创建的,那么建立通信的又是哪个方法呢?真正的通信又是什么时候开始建立呢?
这里我们先回答第一个问题,建立通信是由MonkeySourceNetwork的私有成员方法startServer来处理的:
private void startServer()
throws IOException
{
this.clientSocket = this.serverSocket.accept();
...
MonkeySourceNetworkViews.setup();
wake();
this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
this.output = new PrintWriter(this.clientSocket.getOutputStream(), true);
}
代码6-2-1 MonkeySourceNetwork - startServer
572行: 通过调用serverSocket的accept方法来建立一个与客户端连接的Socket通信通道,并把该Socket实例赋予给clientSocket,往下会通过操作这个Socket实例来和客户端交互
581行: 初始化从clientSocket读取数据的BufferedReader实例并赋予给input成员变量,往后的代码只需要调用input的readline方法就能获得一行命令字串数据
583行: 初始化往clientSocket打印输出的PrintWriter实例并赋予给output成员变量,往后的代码只需要调用output的print或者println之类的方法就能往客户端传送数据
回答完第一个问题后,我们跟着看第二个问题,什么时候开始建立通信的?其实这个问题到了现在可以替换成:startServer是谁触发调用的。是从Monkey类的循环执行事件方法runMonkeyCyles调用mEventSource.getNextEvent开始触发的。上一章已经分析过这里的mEventSource是被初始化成MonkeySourceNetwork,因为Monkey是通过MonkeyRunner发送的命令”monkey --port 12345”来启动的。那么我们进入MonkeySourceNetwork的getNextEvent方法:
682 public MonkeyEvent getNextEvent()
683 {
684 if (!this.started) {
685 try {
686 startServer();
687 } catch (IOException e) {
688 Log.e("MonkeyStub", "Got IOException from server", e);
689 return null;
690 }
691 this.started = true;
692 }
...
696 try
697 {
698 for (;;)
699 {
700 MonkeyEvent queuedEvent = this.commandQueue.getNextQueuedEvent();
701 if (queuedEvent != null)
702 {
703 return queuedEvent;
704 }
...
709 if (deferredReturn != null) {
710 Log.d("MonkeyStub", "Waiting for event");
711 MonkeyCommandReturn ret = deferredReturn.waitForEvent();
712 deferredReturn = null;
713 handleReturn(ret);
714 }
715
716 String command = this.input.readLine();
717 if (command == null) {
718 Log.d("MonkeyStub", "Connection dropped.");
719
720
721 command = "done";
722 }
723
724 if ("done".equals(command))
725 {
726 try {
727 stopServer();
728 } catch (IOException e) {
729 Log.e("MonkeyStub", "Got IOException shutting down!", e);
730 return null;
731 }
732
733
734 return new MonkeyNoopEvent();
735 }
736
737
738 if ("quit".equals(command))
739 {
740 Log.d("MonkeyStub", "Quit requested");
741
742 returnOk();
743 return null;
744 }
...
748
749 if (!command.startsWith("#"))
750 {
...
755 translateCommand(command);
756 }
757 }
758
759 return null;
760 }
761 catch (IOException e)
762 {
763 Log.e("MonkeyStub", "Exception: ", e);
764 }
765 }
代码6-2-2 MonkeySourceNetwork - getNextEvent
684-687行: 如果在此之前还没有建立和客户端的通信的话,那么调用startServer方法来建立通信
691行: 把通信状态保存下来。下次调用getNextEvent获取命令字串时就会在684行判断通信是否已经建立,是的话就会使用既有的通信,而不会创建新的Socket通信了
698行: 进入一个无限循环,直到获取到一个事件位置
700-703行: 如果命令队列中还有事件没有处理的话,从命令队列中取得一个事件返回
716行: 通过调用上面提到的input的readline方法获得一个MonkeyRunner客户端发送过来的命令字串
724-728行: 判断如果MonkeyRunner发送过来的命令字串是”done”的话,关闭与客户端的Socket通信
738-744行: 判断如果MonkeyRunner发送过来的命令字串是”quit”的话,直接退出循环
749-756行: 判断如果MonkeyRunner发送过来的命令字串不是上面两种情况,且不是以”#”号开始的话,调用MonkeySourceNetwork的translateCommand来进行往下的命令字串的解析翻译处理工作
转载于:https://blog.51cto.com/10988776/1731419
老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串...相关推荐
- 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...
老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...
- 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...
老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...
- 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...
老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例 在上一节的第一个"增加日记"的示例中,我们并没有看到日记 ...
- 老李推荐: 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge 1...
老李推荐: 第8章4节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-启动AndroidDebugBridge 上一节我们看到在启动AndroidDebugBri ...
- 老李推荐:第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览 1...
老李推荐:第6章1节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览 在上一章中我们有简要的介绍了事件源是怎么一回事,但是并没有进行详细的描述.那么往下的这几个 ...
- 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列...
老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列 事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些事件 ...
- 老李推荐: 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例 1...
老李推荐: 第3章2节<MonkeyRunner源码剖析>脚本编写示例: MonkeyDevice API使用示例 上一节我们学习了如何通过MonkeyRunner这个类的静态方法wait ...
- 老李推荐:第14章8节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树 1...
老李推荐:第14章8节<MonkeyRunner源码剖析> HierarchyViewer实现原理-获取控件列表并建立控件树 poptest是国内唯一一家培养测试开发工程师的培训机构,以学 ...
- 老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数...
老李推荐:第8章2节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-解析处理命令行参数 MonkeyRunnerStarter是MonkeyRunner启动时的入 ...
- 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例(原创)
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿 ...
最新文章
- 十进制转换成二进制列表
- hdu 3635(并查集+路径压缩变形)
- Actor IM 中 WebRTC的设定
- Android开发Android studio之gradle打包apk重命名的方法
- CommonResult响应工具类封装
- linux基础-第十六单元 yum管理RPM包
- 消息中间件学习总结(6)——RocketMQ之RocketMQ大数据畅想
- 08面向对象编程风格
- 从零开始刷Leetcode——数组(581.605.628)
- HDU4405(期望DP)
- 小学生计算机考试软件,中小学生准考证制作打印软件
- Simply Fortran 保姆级教程
- Java实现家庭账户收支记录表
- 流水号(自动编号)生成相关问题(并发、事务)及解决方案
- CE-RTI开源软件代码学习笔记(一)
- 成考本科计算机找工作有用吗,成人本科学历找工作有用吗 就业困难吗
- java传纸条问题_小学生考试传纸条作弊,老师看到纸条内容,表示让人“着急”...
- oracle取同期和上期,取同期和上期数据
- matlab 实现常用的混沌映射(Tent, Sine, Sinusoidal, Piecewise, Logistic, Cubic, Chebyshev)
- 七进制转十进制java_java基础——Java进制转换
热门文章
- 我刷uvaoj的经历(1)
- pc 页面在移动端怎么获取放大倍数、_逆冬:移动端排名应该怎么做?两种匹配移动端实战排名干货分享!...
- 顺序容器和关联容器添加新元素方法详解
- 【NLP】揭秘马尔可夫模型神秘面纱系列文章(四)
- POJ - 3624 (01背包问题)(动态规划-滚动数组)
- git提交过滤target文件 idea_详解如何在IntelliJ IDEA中使用.ignore插件忽略不必要提交的文件...
- 645.错误的集合(力扣leetcode) 博主可答疑该问题
- 庖丁解牛之spring源码系列一
- FineReport中统计列中不同数据的个数
- swift 有道 翻译文档(1 定义变量常量,数组字典)