老李推荐:第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览 1...
老李推薦:第6章1節《MonkeyRunner源碼剖析》Monkey原理分析-事件源-事件源概覽
在上一章中我們有簡要的介紹了事件源是怎么一回事,但是并沒有進行詳細的描述。那么往下的這幾個小節我們就需要把這方面的知識給補充完整。
這一節我們先主要圍繞MonkeySourceNetwork這個事件源來學習事件源的框架結構。首先,要理解事件源,必須先搞清楚幾個問題:
事件從哪里來?
Monkey的事件來源有多個方面,但是作為MonkeyRunner框架的一部分,它的事件來源主要是來自MonkeyRunner通過網絡Socket(USB/TCP協議)發送過來的命令字串。MonkeySourceNetwork這個事件源類就是專門處理這些請求的。MonkeySourceNetwork會在初始化的過程中建立一個ServerSocket來供客戶端連接,Socket的端口就是MonkeyRunner通過ADB shell發送給Android目標機器的啟動monkey的命令“monkey –port 12345”中的12345。?
public MonkeySourceNetwork(int port) throws IOException {
// Only bind this to local host. This means that you can only
// talk to the monkey locally, or though adb port forwarding.
serverSocket = new ServerSocket(port,0, // default backlog
InetAddress.getLocalHost());
}
代碼6-1-1 MonkeySourceNetwork - 構造函數
?
來自網絡的事件命令字串如何轉換成事件?
來自網絡的字串是不能直接使用的,Monkey必須把該命令字串進行解析,在必要的時候轉換成對應的Monkey事件,這個過程在Monkey中稱為命令翻譯。MonkeySourceNetwork一旦從MonkeyRunner客戶端獲取一個字串命令,它就會根據其內部成員COMMAND_MAP這個“字串命令 - 命令翻譯類對象”的映射表,檢索到該命令字串對應的翻譯類對象,然后就會調用它的命令翻譯方法來把該字串命令翻譯成對應的MonkeyEvent事件,這里說的MonkeyEvent是所有具體事件如MonkeyFlipEvent的父類。以下代碼就是COMMAND_MAP在MonkeySourceNetwork類中的實現:
? ? ?private static final Map<String, MonkeyCommand> COMMAND_MAP = new HashMap<String, MonkeyCommand>();
?
???? 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.put("listviews", new MonkeySourceNetworkViews.ListViewsCommand());
???????? COMMAND_MAP.put("queryview", new MonkeySourceNetworkViews.QueryViewCommand());
???????? COMMAND_MAP.put("getrootview", new MonkeySourceNetworkViews.GetRootViewCommand());
???????? COMMAND_MAP.put("getviewswithtext",
???????????????????????? new MonkeySourceNetworkViews.GetViewsWithTextCommand());
???????? COMMAND_MAP.put("deferreturn", new DeferReturnCommand());
???? }
代碼6-1-2 MonkeySourceNetwork - COMMAND_MAP
?
?
它的鍵是String類型的字串,代表的是從網絡過來的命令字串;它的值是MonkeyCommand的實例,代表的是負責將該命令字串翻譯成對應事件的類實例,但要注意的是并不是所有的命令都會生成對應的事件對象并放到事件隊列里等待執行,有些命令會在翻譯的過程中直接處理返回的。往下描述MonkeyEvent事件的時候會有更詳盡的描述。
轉載于:https://blog.51cto.com/10988776/1731417
總結
以上是生活随笔為你收集整理的老李推荐:第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览 1...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于验证
- 下一篇: 通过练习题学习磁盘知识