当前位置: 首页 > news >正文

国内产品网站建设桥拓云智能建站

国内产品网站建设,桥拓云智能建站,平面logo设计公司,千博企业网站在上文中#xff0c;我们讲解了如何把HierarchyViewer的项目导入到Eclipse中#xff0c;以便更高效阅读代码。本文将讲解HierarchyViewer的后台代码#xff0c;建议大家可以先阅读Android工具HierarchyViewer代码导读(1) -- 功能实现演示一文, 其中的代码演示了Hier…在上文中我们讲解了如何把HierarchyViewer的项目导入到Eclipse中以便更高效阅读代码。本文将讲解HierarchyViewer的后台代码建议大家可以先阅读Android工具HierarchyViewer代码导读(1) -- 功能实现演示一文, 其中的代码演示了HierarchyViewer的主要功能。而本文就是讲解HierarchyViewer是如何实现功能的。   把复杂的代码讲解清楚一般都不是很容易的事情为了不把本文写成流水帐文章将尽量集中在HierarchyViewer后台代码的主要脉络上许多细节需要读者自己去阅读那是必须的。   MVC模式 HierarchyViewer采用典型的MVC模式设计。 当打开HierarchyViewer进入主界面时其对应的MVC模式是HierarchyViewerDirector.java是ControllerDeviceSelectionModel.java是ModelDeviceSelector是View如下图所示   当双击某个Acitivity进入浏览层次图界面时其对应的MVC模式是HierarchyViewerDirector.java是ControllerTreeViewModel.java是ModelViews是TreeViewController.java、TreeViewOverview.java、PropertyViewer.java、TreeViewer.java、LayoutViewer.java:   HierachyViewerDirector.java即Controller通过DeviceBridge.java来和Android设备通信而DeviceBridge.java具体是通过AndroidDebugBridage.java和DeviceConnection.java来和设备通信。如下图所示   AndroidDebugBridge.java : AndroidDebugBridge.java是ADB API位于ddmlib项目中。 它实现了命令行版adb一样的功能在HierarchyViewer中主要用到其连接设备forward端口启动ViewServer等操作。 DeviceConnection.java: 负责和ViewServer通信向ViewServer发送命令并接受其返回的信息。从而获取Activity列表、控件层次结构图、截图等。   入口点 后台代码的入口点在HierarchyViewerApplication.java的createContents method中 Overrideprotected Control createContents(Composite parent) {// create this only once the window is opened to please SWT on MacmDirector HierarchyViewerApplicationDirector.createDirector();mDirector.initDebugBridge();mDirector.startListenForDevices();mDirector.populateDeviceSelectionModel();//... ...} 以上代码做了如下工作 1HierarchyViewerApplicationDirector.createDirector() -- 创建一个HierarchyViewerDirector对象 2mDirector.initDebugBridge() -- 初始化AndroidDebugBridge 3mDirector.startListenForDevices() -- 把mDirctor注册为AndroidDebugBridge的监听者HierarchyViewerDirector继承了IDeviceChangeListener接口当有设备连接、断开、改变时mDirctor将接收到事件。 4mDirector.populateDeviceSelectionModel() -- 获取当前已经连接的设备列表处理并显示它们。   阅读populateDeviceSelectionModel()函数你会发现 其中获取到当前已经连接的所有设备列表后是通过deviceConnected函数来“处理”这些设备当有新设备连接触发设备连接事件时也是通过deviceConnected函数来“处理”它。   启动并连接设备的ViewServer获取Activities并显示列表 HierarchyViewerDirector的deviceConnected 方法是对IDeviceChangeListener接口方法的实现我们来看它是如何“处理”一台和adb建立连接的设备的 public void deviceConnected(final IDevice device) {executeInBackground(Connecting device, new Runnable() {public void run() {if (DeviceSelectionModel.getModel().containsDevice(device)) {windowsChanged(device);} else if (device.isOnline()) {DeviceBridge.setupDeviceForward(device);if (!DeviceBridge.isViewServerRunning(device)) {if (!DeviceBridge.startViewServer(device)) {// Lets do something interesting here... Try again// in 2 seconds.try {Thread.sleep(2000);} catch (InterruptedException e) {}if (!DeviceBridge.startViewServer(device)) {Log.e(TAG, Unable to debug device device);DeviceBridge.removeDeviceForward(device);} else {loadViewServerInfoAndWindows(device);}return;}}loadViewServerInfoAndWindows(device);}}});} 在这个方法中做了如下事情 1DeviceBridge.setupDeviceForward(device) -- 把该设备的4939端口映射到本地端口。 HierarchyViewer维护一个列表 --sDevicePortMap它记录哪个设备被映射到了哪个本地端口。 2DeviceBridge.isViewServerRunning(device) -- 判断该设备的ViewServer是否打开。 3DeviceBridge.startViewServer(device) -- 打开ViewServer。 4loadViewServerInfoAndWindows(device) -- 1获取该设备ViewServer信息比如版本信息等 2获取该设备其所有活动的Activities在HierarchyView源代码中Activities总是被命名为Windows。 如果读者不明白以上函数的意义再次建议阅读功能实现演示   让我们Step Into”来看看loadViewServerInfoAndWindows方法 private void loadViewServerInfoAndWindows(final IDevice device) {ViewServerInfo viewServerInfo DeviceBridge.loadViewServerInfo(device);if (viewServerInfo null) {return;}Window[] windows DeviceBridge.loadWindows(device);DeviceSelectionModel.getModel().addDevice(device, windows, viewServerInfo);if (viewServerInfo.protocolVersion 3) {WindowUpdater.startListenForWindowChanges(HierarchyViewerDirector.this, device);focusChanged(device);}}   1DeviceBridge.loadViewServerInfo(device) -- 读取ViewServer信息。 2DeviceBridge.loadWindows(device) -- 发送 “LIST”命令给ViewServer读取设备所有活动的Activities。 3DeviceSelectionModel.getModel().addDevice(device, windows, viewServerInfo) -- 更新DeviceSelectionModel数据然后该Model将通过事件通知Views来更新显示。   我们到哪了 在以上代码完成后HierarchyViewer完成了主界面的加载已经连接的设备及其活动的Activities显示出来了 读取Activity的控件层次图 这时当用户双击上图中设备的某个Activity希望查看其控件层次图时事件DeviceSelector.java中的widgetDefaultSelected事件将调用HierarchyViewerDirector.java的loadViewTreeData方法 public void loadViewTreeData(final Window window) {executeInBackground(Loading view hierarchy, new Runnable() {public void run() {mFilterText ; //$NON-NLS-1$ViewNode viewNode DeviceBridge.loadWindowData(window);if (viewNode ! null) {DeviceBridge.loadProfileData(window, viewNode);viewNode.setViewCount();TreeViewModel.getModel().setData(window, viewNode);}}});}   1DeviceBridge.loadWindowData(window) -- 读取Activity的所有控件信息并把每个控件的信息构造成一个ViewNode对象,所有的ViewNode组成一个树该函数的返回值是树的根节点。 2DeviceBridge.loadProfileData(window, viewNode) -- 遍历整个ViewNode树为树中的每个节点向ViewServer读取ProfileData。遗憾的是目前为止我也没有搞明白ProfileData的作用。 3viewNode.setViewCount() -- 遍历整个ViewNode树计算每个子树所包含的节点数量保存在ViewNode的viewCount字段中。 4TreeViewModel.getModel().setData(window, viewNode) -- 更新TreeViewModel的数据源该Modell将通知所有监听者 -- TreeViewController.java、TreeViewOverview.java、PropertyViewer.java、TreeViewer.java、LayoutViewer.java来更新视图。   读者可以“Step into” loadWindowData方法可以看到它是通过向ViewServer发送”DUMP”命令来获取整个控件树信息的。 正如我们在《功能实现演示》中讲到的ViewServer返回给我们的控件树信息是一个内容巨大的文本HierarchyViewer怎么把这个文本解析成ViewNode树的而TreeViewer.javaLayoutViewer.java等视图又是如何根据ViewNode来进行绘制的我们将是下文《前台代码》中讲解。   我们到哪了 现在我们获取到了该Activity的控件树并且各个Views – TreeViewer.java、LayoutViewer.java等根据ViewNode树完成了绘制   加载控件截图 这时当用户选中hierarchy view(TreeView.java)上的某个节点时HierarchyViewer将向ViewServer请求该控件的截图并显示在该节点上面的气泡中这是怎么做到的呢 当点击hierarchy view上的节点时TreeView.java上的selectionChanged方法override ITreeChangeListener接口被触发该事件的触发过程可能要到下文前台代码中才能说清楚, 它将调用HierarchyViewerDirector.java的loadCaptureInBackground方法 public void loadCaptureInBackground(final ViewNode viewNode) {executeInBackground(Capturing node, new Runnable() {public void run() {loadCapture(viewNode);}});}   让我们“Step into” loadCapture方法 public Image loadCapture(ViewNode viewNode) {final Image image DeviceBridge.loadCapture(viewNode.window, viewNode);if (image ! null) {viewNode.image image;// Force the layout viewer to redraw.TreeViewModel.getModel().notifySelectionChanged();}return image;}   DeviceBridge.loadCapture(viewNode.window, viewNode) -- DeviceConnection.java向ViewServer发送CAPTURE”命令来获取控件截图 viewNode.image image --把截图保存在viewNode中下次再次选中节点时就不用再向ViewServer请求了 TreeViewModel.getModel().notifySelectionChanged() -- 强制TreeViewModel向监听者发送SelectionChanged事件。   我们到哪了 获取到控件截图后TreeViewModel通知hierarchy view进行更新于是我们看到截图在气泡中显示出来   总结语 我们试图理清HierarchyViewer后台代码的主要脉络同时我们似乎也“遗漏”了更多内容我们没有阅读DeviceBridge.java看它都支持哪些ViewServer命令 -- 我们已经知道的有LIST、DUMP、CAPTURE我们没有深入阅读AndroidDebugBridge.java是如何工作的也许不久后我就会写这方面的文章我们也没有阅读当设备断开、改变时当进行刷新等操作时的代码。 我想我不能剥夺大家自己去阅读代码的乐趣。   本系列的最后一篇我们将阅读HierarchyViewer的前台代码。   本文由知平软件的刘斌华原创转载请注明出处。 知平软件致力于移动平台自动化测试技术的研究我们希望通过向社区贡献知识和开源项目来促进行业和自身的发展。转载于:https://www.cnblogs.com/vowei/archive/2012/08/08/2627614.html
http://www.pierceye.com/news/172793/

相关文章:

  • 个人网站制作代码河北seo基础知识
  • 国内做视频的网站有哪些企业网站价格花
  • 泰安网站推广优化wordpress首页图片
  • 政协网站建设更改wordpress管理员用户名
  • 网站浏览器兼容性通用有那种网站么
  • 网站中全景是怎么做的云南网络营销文化优化
  • 苏州网站优化哪家好换空间对网站的影响
  • 如何做黑客攻击网站专业的网站建设运营
  • 门户网站建站流程做网站在哪里做比较好
  • 青创网站首页wordpress用户发文章
  • wordpress 仿站 主题网站建设拍金手指排名贰拾
  • 自己的网站怎么做跳转广州白云建方舱医院
  • 免费搭建购物网站网页游戏网站打不开
  • 专业的东莞网站设计wordpress extra script
  • 嘉兴网站开发公司电话从零开始创建wordpress主题.pdf
  • 备案号怎么添加到网站自己做网站原始代码
  • 可以做exe的网站邯郸做紧固件网站
  • 电子商务网站开发的说法移动端首页尺寸
  • 普通网站服务器房地产营销门户网站开发
  • 免费做公司网站wordpress文章格式
  • 制作网站教学设计金湖县城乡建设局网站
  • 微商城网站建设咨询网站做的不满意
  • 装企工长网站开发互联网营销师考试内容
  • 广州高端网站定制公司哪家好全椒县城乡规划建设局网站
  • 物流网站毕业设计论文论坛网站模板下载
  • 代理上网蜗牛精灵seo
  • 网站怎么做用qq登录接入网络舆情监测分析系统
  • 怎么把几个网站做互通wordpress 英文站
  • 建设高端网站需要多少钱wordpress检测
  • 如何学习网站建设app嘉兴建站软件