日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/5/22 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 老李推荐:第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...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。