说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Android开发进阶之NIO非阻塞包(六)

HTML文档下载 WORD文档下载 PDF文档下载
Android开发进阶之NIO非阻塞包(六)

作者:Android开发网


  有关Android NIO的相关内容,本次Android123整理并归类如下,为了让大家感觉NIO和Android平台联系的紧密,这里我们结合ADT插件的重要开发工具DDMS中的源码进行分析。在android git中的sdk.git文件中,可以找到ddmlib这个文件夹。有关PC和手机的互通内核在这里使用了Java来完全实现。这里Android开发网一起帮助大家了解下PC同步软件的开发原理同时学习下Java中的New I/O技术。

   比较重要的代码段我们贴出,逐一分析,其他的网友可以直接预读源码:

   AdbHelper.java文件中

   public static SocketChannel open(InetSocketAddress adbSockAddr,
            Device device, int devicePort) //这是一个重载版本,主要是关联Device实例。
            throws IOException, TimeoutException, AdbCommandRejectedException {

        SocketChannel adbChan = SocketChannel.open(adbSockAddr); //构造SocketChannel对象,使用常规的open方法创建
        try {
            adbChan.socket().setTcpNoDelay(true); //设置TCP非延迟
            adbChan.configureBlocking(false); //非阻塞

            setDevice(adbChan, device); //本句和NIO没有多大关系,这句是指定具体的设备,比如模拟器,或Android手机的厂家代号,比如宏达电的以HTXXXXX这样的方式

            byte[] req = createAdbForwardRequest(null, devicePort); //设置端口转发,这句很关键,否则PC和手机通过USB是无法互通的。
            write(adbChan, req); //发送数据

            AdbResponse resp = readAdbResponse(adbChan, false); //读取收到的内容
            if (resp.okay == false) {
                throw new AdbCommandRejectedException(resp.message);
            }

            adbChan.configureBlocking(true);
        } catch (TimeoutException e) { //一般要处理超时异常
            adbChan.close(); //释放channel句柄
            throw e;
        } catch (IOException e) { //处理常规的IO异常
            adbChan.close();
            throw e;
        }

        return adbChan;
    }

   有关读取ADB返回的报文方法

  static AdbResponse readAdbResponse(SocketChannel chan, boolean readDiagString)
            throws TimeoutException, IOException {

        AdbResponse resp = new AdbResponse();

        byte[] reply = new byte[4]; //创建4字节数组,主要检测成功与否,adb的协议是成功返回 okay,失败fail,等等。
        read(chan, reply); //读取具体的返回

        if (isOkay(reply)) { //判断是否成功
            resp.okay = true;
        } else {
            readDiagString = true; // look for a reason after the FAIL
            resp.okay = false;
        }

        // not a loop -- use "while" so we can use "break"
        try {
            while (readDiagString) {
                // length string is in next 4 bytes
                byte[] lenBuf = new byte[4];
                read(chan, lenBuf); //读取一个字节数组,最终为了转为一个整形

                String lenStr = replyToString(lenBuf); //字节数组转为String

                int len;
                try {
                    len = Integer.parseInt(lenStr, 16); //String转为整形,这里Android123提示,这种写法可能比较愚蠢,但是下面为Log输出提供了一点点的便利。
                } catch (NumberFormatException nfe) {
                    Log.w("ddms", "Expected digits, got '" + lenStr + "': "
                            + lenBuf[0] + " " + lenBuf[1] + " " + lenBuf[2] + " "
                            + lenBuf[3]);
                    Log.w("ddms", "reply was " + replyToString(reply));
                    break;
                }

                byte[] msg = new byte[len];
                read(chan, msg);

                resp.message = replyToString(msg);
                Log.v("ddms", "Got reply '" + replyToString(reply) + "', diag='"
                        + resp.message + "'");

                break;
            }
        } catch (Exception e) {
            // ignore those, since it's just reading the diagnose string, the response will
            // contain okay==false anyway.
        }

        return resp;
    }

   有关PC上对Android手机屏幕截图的方法之一:

   static RawImage getFrameBuffer(InetSocketAddress adbSockAddr, Device device)
            throws TimeoutException, AdbCommandRejectedException, IOException {

        RawImage imageParams = new RawImage();
        byte[] request = formAdbRequest("framebuffer:"); // 读取手机端adbd服务器的framebuffer调用返回的数组

        byte[] nudge = {
            0
        };
        byte[] reply;

        SocketChannel adbChan = null;
        try {
            adbChan = SocketChannel.open(adbSockAddr);
            adbChan.configureBlocking(false); //非阻塞

            setDevice(adbChan, device); //设置我们关系的设备

            write(adbChan, request); //发送framebuffer这个请求了

            AdbResponse resp = readAdbResponse(adbChan, false /* readDiagString */);
            if (resp.okay == false) {   //判断返回是否ok。
                throw new AdbCommandRejectedException(resp.message);
            }

            reply = new byte[4];
            read(adbChan, reply); //首先返回的是一个协议,目前分为两个版本,主要是兼容模式和标准的模式,兼容模式比较少见,在2.0以后几乎看不到了。部分早期的1.6或更老的T-Mobile G1会使用兼容模式,模式不同,输出的截图中的颜色编码方式略有不同。

            ByteBuffer buf = ByteBuffer.wrap(reply);
            buf.order(ByteOrder.LITTLE_ENDIAN); //小头字节顺序

            int version = buf.getInt(); //ByteBuffer直接转int的方法,比较方便不用自己从字节数组中构造,按位计算

            int headerSize = RawImage.getHeaderSize(version); //根据返回的adb截图协议版本判断将收到的字节大小

            reply = new byte[headerSize * 4]; //分配空间,具体大小需要看协议版本
            read(adbChan, reply);

            buf = ByteBuffer.wrap(reply); //从reply数组实例化ByteBuffer
            buf.order(ByteOrder.LITTLE_ENDIAN); //注意字节序列,毕竟远端的adbd是工作在linux系统的手机上。

            if (imageParams.readHeader(version, buf) == false) { //判断是否有效,兼容这种截图协议。
                Log.e("Screenshot", "Unsupported protocol: " + version);
                return null;
            }

            Log.d("ddms", "image params: bpp=" + imageParams.bpp + ", size="
                    + imageParams.size + ", width=" + imageParams.width
                    + ", height=" + imageParams.height); //打印下截图的基本信息,比如bpp代表色深,size是需要分配dib图像的字节数组。比较原始,

            write(adbChan, nudge); //发送一个字节,代表准备接收字节数组了

            reply = new byte[imageParams.size]; //分配和图像大小一样的字节数组
            read(adbChan, reply); //接收图像字节数组,这里Android开发网提示大家对于Android 1.x可能为RGB565,分配大小为 wxhx2xsize ,而2.x以后基本上为32位的RGB8888,分配大小为wxhx4xsize

            imageParams.data = reply;
        } finally {
            if (adbChan != null) {
                adbChan.close();
            }
        }

        return imageParams;
    }

  有关Android平台PC通过USB的ADB方式和手机同步原理和NIO相关技术,Android123明天继续讲解。

Adobe再遭APT攻击:数十G源代码及290万用户信息失窃 程序员,如何在工作中崭露头角? 国内外三个不同领域巨头分享的Redis实战经验及使用场景 这是一场潜在的战争:谷歌与Facebook、苹果在搜索上的博弈 设计新闻类网站需要注意的关键点:移动友好、宽带…… 直接开始用:5个免费的在线思维组织工具 招聘开发者常见的九大误区 开源影响销售,维护赞助商? 盘点黑客攻击途径:最常用的7个策略及简单的防护方法 专访AngularJS框架创始人Misko Hevery:让Web开发更便捷 果粉的又一个节日:新iPad或于10月22日发布 新车间李大维:到集装箱里来看创客嘉年华 亚马逊推“登录与支付”功能 直接冲击PayPal Google编程之夏新里程碑:5000万行源代码 8500名学生开发者 非常实用的15款开源PHP类库 Runnable:一站式代码片段服务平台,打造编程界的YouTube 谷歌向所有开发者开放Google App Engine PHP Runtime “沟通”电子表格和矢量图形的“桥梁”:在线可视化工具Raw Facebook北极圈数据中心,Open Compute Project的力作! 最后三天!4折抢购2013移动开发者大会门票 电子书追踪统计,App Annie for eBooks上线 先驱还是模仿者?细数海外移动应用推广平台 IDC:PC出货量下滑终于放缓 联想销量再次第一 为什么说,用一块屏幕玩游戏是远远不够的? 编写代码?先熟悉一下编程语言界限吧! Spanner vs. F1:谷歌两大数据管理利器的整体对比及关联 移动设计需摒弃的几大PC应用设计方法 响应式导航设计案例解析(多图) 所见即所得:七大无需编程的DIY开发工具 前Google员工发布无痕搜索产品,阻老东家财路 VMware推出vCloud Suite及vSphere新版:可用性及性能双丰收 VB中远程数据库的访问 如何实现使textbox中只能输入带两位小数的内容?即保证其中内容为*.XX(*代表任意数字串),凡不合要求的输入都被过滤? 如何在IIS的DefaultWEB Site的属性的HTTP Header中加入新的File type?? 怎样读jpeg的头文件,用C语言,谢了 为什么我远程连接sql server总不成功呢?我已经把1433端口开了啊 西游记 如何判断一个大整数是素数,如何找出整数的模逆 多层数据库开发源码大公开---不可多得! WinZip等的右键菜单Add to xxx.zip是怎么实现的? 帮帮忙,急! 因写程序丢过头发的请进. 怎样使lable的内容分两行显示 一个使我困惑的小问题,敬请关注(***100分***)!! 帮帮忙好吗? 二个关于字符串中对子串的替换与删除的问题? 怎样实现虚构造函数? 请问各位高手,手机图片和手机铃声是什么格式的?在电脑上能不能打开?应该怎么制作? 请大家帮个忙,有个小问题,如何用showmessage输出括号内的内容('%K%')?在线等待 A simple problem!? 救命,对话框显示的奇怪问题!!! An error 1069 (由于登录而无法启动服务器) 请问为什么向Oracle表里加不上记录? 我在局域网中用些东西常被主机防火墙隔了,有什么办法绕过防火墙 谁有MPEG-LAYER3的详细资料或连接? 我用一些软件如音乐大师等,一打开程序,该程序窗口就被关闭了,而在光盘上进行都可以? 如何判断一个大整数是素数,如何找出整数的模逆 怎样使用C#做互相通信的client/server程序 image类型字段,如何用update命令更新 请问指针的指针,二维数组,指针数组,之间有何区别 PB数据库连接字符串的问题 如何购买NFS软件,是Windows pc 访问AIX用的? 请囊相授求mcsd信息 为什么对话框程序最小化时占用内存会减少很多呢?(VC6) 备份主域控制器加入后,登陆不进去了 新手上路,DDE的,绝对给分!!! 帮帮我 怎样修改一个窗口的系统菜单? 怎样将自己做的ASP.NET程序放到IIS服务器上去?服务器需要怎么配置? 在线等待一个问题!!!解决问题就散帖 关于NETANT的有不健康连接的通知????? 一个关于SQL_Server2000复制时发生的问题,请大家帮忙!(在线等待) 当我删除一条记录时会跳出错误,谁帮我看看 请囊相授求帮助 对这个程序实现上大家有什么想法? 触发器一行更新与多行更新有什么区别 请问如何能让我的Cricheditctrl最多输入100个字符???谢谢!!!!! 关于向数据库中插入时间的问题 在局域网中如何判断是否连到服务器?(用delphi) 有没有嘉兴的高手?QQ13136276mailsunrace@163.com 150分:怎样实现类似Delphi中的TClass.Create的功能? 请大家给我这个oracle初学者一些入门指点(偏重Developer 和discoverer方面) 一辆汽车从甲地去乙地,已行了全程的五分之二,这时距中点还有15千米.已行了多少千米? 古诗4首词4首儿童诗4首现代诗6首g 从8男5女中选出4人参加书法比赛,其中有至少2名女生,共有多少种选法?我知道C5,2C8,2+C5,3C8,1+C5,4这种算法,我只是想知道为什么C5,2C11,3不可以?我觉得也可以解释啊,先从5个女生中选两个,然后从剩 有关友情 的诗句越多越好 求七首现代诗或者是儿童诗字数少一点的啊 快点哦 What kind of cake would you like (同义句) What kind of cake ____ you ______? 一辆汽车从甲地开往乙地,行了全程的五分之二后,离终点还有15千米甲乙两地相距离多少千米?可以用方程或算术,最好是算术!还要说明为什么? 一辆货车从甲地开往乙地,已经行全程的五分之二,距离终点还有25千米,甲乙两地相距多少千米?算式 在生活中像蒲公英那样和我们一起睡觉一起起床的事物有哪些 一辆汽车从甲地开往乙地,已经行了全程的五分之二,距离中点还有120千米.甲地到乙地相距多少千米? 一辆汽车从甲地开往乙地,行了全程的25%,距离终点还有60千米,甲乙两地的路程是多少千米2013年5月10日以前答对, 为什么说蒲公英跟我们一起睡觉一起起床 一辆汽车从甲地到乙地,已经行了全程的五分之二,离中点还有15千米,甲乙两地相距多 请问秋蒲公英是一种什么样的花儿?与普通的蒲公英有什么差别?可有图片的链接? 蒲公英和我们一起睡觉,一起起床.(仿写句子) 游乐场的门票原来每张30元,六一 期间八折优惠,购买一张门票能省多少元?请不要乱答 蒲公英寓意是什么 为什么说蒲公英和我们一起睡觉,和我们一起起床 人教版六年级语文书(上下)的古诗有什么?要把古诗写出来!现在就要! 蒲公英是一种什么样的花 蒲公英的花和我们一起睡觉,和我们一起起床,是什么修辞方法 一辆汽车从甲地开往乙地,每小时行60千米,五分之二小时刚好行到全程的一半,甲、乙两地相距多少千米? 蒲公英花有什么变化 正四面体的4个顶点都在一球面上,且正四面体高为4,则球的表面积为多少 一辆汽车从甲地到乙地,3小时行全程的五分之二,如果再行60千米,这时已行的和剩下的比是5:3.这辆汽车每小时行多少千米? 急求儿童诗,50字以下! 棱长为a的正四面体的四个顶点均在一个球面上,求此球的表面积 六年级(1)班与(2)班人数相等,两两班各有一些同学参加计算机小组,(1)班参加计算机小组的人数恰好是(21/3,(2)班参加计算机小组的人数恰好是(1)班没有参加计算机小组人数的1/4.(1) 甲.乙两车同时从A.B两地相对而行,经3小时后,两车还相距全程的五分之二,已知甲车每小时行60千米,甲.乙两车的速度是5:4,求A.B两地的路程是多少千米? 一辆汽车从甲地开往乙地,2小时行了全程的五分之二,这时距离中点还有18千米,这辆汽车平均每小时行多少千 六年级同学中参加篮球兴趣小组的人数是计算机小组的3/4,计算机小组的人数是书法小组的2/5参加篮球的有24人,参加书法的有多少人? 客车从甲地开往乙地,已经行了全程的五分之二,距两地中点还有60千米,求甲,乙两地之间的公路线长多少千 一辆汽车从甲地开往乙地已经行了3小时平均每小时行72千米,剩下路程是两地距离的五分之二两地距离多少千米 我抓了一只虫子,大家来看看,这是神马虫啊. 开学后的感受六年级 做一个长12厘米宽8厘米高6厘米的长方体框架,至少要铁丝多少厘米?在这个框架外糊上一层白纸,至少需要多少平方米白纸? 蒲公英的花是什么颜色的. 蒲公英的花有什么作用 用铁丝做一个长12厘米,宽8厘米,高5厘米的长方体框架,至少需要()厘米的铁丝.(接头处不计.)要列式. 我看见过一种花,花是 一个小球,有很多种色彩,有点像蒲公英想问下大家这个是什么花,我是在西南名族大学有点像啊 但是感觉和我看的不一样呢 蒲公英是花吗?要有确实的说明和证据哦! 用铁丝做一个长8厘米,宽5厘米,高3厘米的长方体框架,至少要多长的铁丝?在这个长方体框架外面糊一层纸,至少要多少平方厘米的纸 一种花,像蒲公英绒绒的,红色的,是什么花.在广州那边很常见 蒲公英的花能吃吗蒲公英的 花 能吃吗(有毒吗)如果不能吃,那么理由是什么是花 what is your sister likeA.She is a worker\x05B.She likes pearsC.She is very thin\x05D.She is like her father 蒲公英花究竟是什么颜色的 一辆汽车从甲地开往乙地,每小时60千米,2小时行了5分之2.行完全要几小时?甲乙两地相距多少千米?5分钟内答出给20分 What ________(be) your sister _________(like)?She is tall and slim. 数学游乐场(不会做的题)一项挖土工程,如果甲队单独做36天可以完成,乙队单独做45天完成.现在两队同时施工,工作效率提高百分之20.当工程完成5分之3是,突然遇到地下水,影响施工进度,使每 一辆客车从甲地开往乙地,3小时后已行的路程与未行的路程比为2/5,又行了60千米后,这时已行的路程与总路快一辆客车从甲地开往乙地,3小时后已行的路程与未行的路程比为2/5,又行了60千米 现代诗(儿童诗)急需3首现代诗,最好是儿童诗..附带多一点的乐趣.只要3首就行了.. 献分分拉今有12张卡片,每张上面都写着一个一位数.其中三张写着1,三张写着3,三张写着5,三张写着7.你能否从中选出5张卡片,使他们上面的数字之和为20,为什么? 一辆汽车从甲地开往乙地,以行了全程的2/5,再行60千米后,以行的和未行的比是3:4,甲乙两地相距多少千米? 现代诗大全 儿童诗 it和it's后面分别接什么词性 从甲地到乙地,一辆汽车行了全程的5分之2,正好是240米,甲,乙两地的距离是多少千米?要有过程 现代诗或儿童诗的格式左起需要空几行? work it out后面接什么词性的词在10点半前 请问这是什么花?跟蒲公英很像! 六二班有48名同学,其中8名男生和女生的五分之一参加书法比赛,则这个班男女生各多少人?加上分析这是加上的) 六二班有48名同学,其中8名男生和女生的五分之一参加书法比赛,这时剩下的
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘