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

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明天继续讲解。

Visual Basic三级跳 Visual Basic使用技巧 Visual Basic中的子类处理技术 Visual Basic中软件封面技术探秘 VisualBasic 软件设计中的几个问题 Windows 95/NT 运行了多长时间 -VB资料 Windows 的登录资料库 -VB资料 把回车键变成TAB键-VB资料 把文件置入到Text或RichText中 -VB资料 避免按 [ENTER] 回车键产生的“嘀”声 -VB资料 避免使用全局变量-VB资料 避免装载多份应用程序-VB资料 不定个数的参数 -VB资料 不在任务栏中显示,只能在Ctrl+Alt+Del对话框中显示或者干脆什么也不显示数 -VB资料 处理 Dropdown List型 Combo的录入问题-VB资料 VB创建和删除快捷方式 从程序中生成 exe 文件 -VB资料 打开和关闭CD-ROM 驱动器 -VB资料 打开和关闭其他应用 -VB资料 打开一个超连接 -VB资料 当前操作系统的语言集-VB资料 当前系统目录-VB资料 得到磁盘上剩余空间的值-VB资料 调用“添加打印机”对话框 -VB资料 调整分辩率和取当前分辩率 -VB资料 定义全局热键-VB资料 动记录应用软件工作时间-VB资料 动态改变屏幕设置-VB资料 读取档案的建立时间及存取时间 -VB资料 多个参数的属性 -VB资料 发现剪帖板的秘密 -VB资料 ftp的问题 请问各位:如何在ASP.NET中打开一个现有的或一个新的WORD文档? 讨论怎么发财 关于查询系统的需求分析怎么写?用触摸屏实现 如何把一个文件保存到数据库中? 耦合 哪里有WEB合同管理代码?或资料?演示?急!!!谢谢!有人知道吗?? 谁能把这段代码破解 求一函数,在线等....... 剛從vb轉delphi,幫我看一看!結貼很快! 如何可在WINXP中改MAC?? sprintf(a,"%2X",b)问题 关于简单的access查询 java字符转换问题!!! 请教一个Struts标记问题! 一个cab下载的错误信息解读,请教高人。 OutLook?怎么用它发邮件,经常提示错误? 帮看这段删除纪录代码有什么问题?三层结构oracle 本人要做一个WEB合同管理平台,由于以前没做过,请大家指示? Web Application 中怎么来调用 Web Server?谢谢! DataGrid中模板列嵌套的DataGrid怎样相应其事件 [调查]程序员证在你们公司里到底有多大的作用?有多少人有证?希望有没有证的都进来说一下。 怎样把字符串"C;\aaa\bbb"变成字符串"C:\aaa\ccc\dd"?用什么函数,操作? 我的SQL Server 装好后,出现下面的错误 这个文件查找真是怪!......msdn源代码居然有问题, 进来看看... 请问在TreeView控件中如何通过光标的上下移动获得光标所在项在数据库中的ID值 對掌上電腦Sony Peg-TG50和ACER N10怎麼看??? 使用SOAP协议传递服务器端查询结果容量问题? 菜鸟问题:数据窗口怎么设置检索参数?急!!在线等 ****入门提出的问题****,请各位高手指教! 很简单的一个问题。 这个问题怎么处理? vb如何调用一个组件?? 一个小问题,可不简单哦! 应聘CMM时,会被问到什么有关CMM的问题? 调用servlet出现这个错误HTTP method POST is not supported by this URL 在公网上如何连接远程数据库啊。。 这算不算bcb的bug?关于Image控件的使用。 使用 GDI 函数画直线时,如何同时在该直线的两端画出箭头来? 怎样改变网卡的工作模式???~~ 疑难杂症--关于共享adsl专线的网络问题--疑难杂症 小弟有一事请教??? 我的IE WEB 控件---TREEVIEW控件,怎么没有treeView.AfterSelect()事件? 新手接触midas的若干典型问题!小的头都搞大了!还是不行!望各位大虾赏个脸解答一下! 一个静态页面中的困惑!心急如焚.................. 请问这句话什么意思? 如何判断一个用户的会话已经失效?-解决立马给分 急:如何改变datagrid的背景色 string sqlstr=DataGrid1.Items[1].Cells[1].Text有错吗? 帮忙,请教一个问题! 请教高手:以下情况如何写sql语句和填写datagrid? 函数f(x)=x+sinx+1(x∈R) ,若f(a)=2 ,则 f(-a) 的值为( 【图】一个摩擦力的题,力F作用于木块a,b,c一起在水平地面上匀速运动…… say dont 数学中的解得是什么意思? 木块在不受力时恰能从斜面上匀速滑下,那么要将木块匀速推上该斜面,求图的受力分析和详细过程需要多大的外力F? DONT SAY NO什么意思 乙烯裂解炉工况特点 smartphone moviemakers是什么意思 dont say goodbye什么意思 石脑油管式炉蒸汽裂解制乙烯.相关内容1举例说明石脑油管式炉蒸汽裂解制乙烯的反应机理,(自由基的链引发连传递链终止),并回答为什么主要产品是乙烯2什么养的石脑油组成更容易裂解 猕猴种类猕猴是指一个品种还是有很多种猕猴的统称? 感应电动势与磁通量变化时间成反比,这句话对吗? 乙烯裂解炉有什么简单实用的提高效率的办法? 这道神题怎么写, 1,3,5,8,13,28,() A 40 B 39 C 36 D 42 变色玻璃的材料有可能做成透明涂料涂在普通玻璃或塑料上吗?变色玻璃的原理好像是往玻璃里加入一些化学物质,被可见光激发会产生可逆反应,同样的原理目前的技术有可能做成透明涂料或 为什么电阻横截面积越粗,对电流阻碍作用越小为什么我觉得 电阻横截面积越粗,对电流阻碍作用 越强、因为嘛、又变粗了- -.所以 电流 通过 就小了 - - (A+B+C) ÷3+D=26 (A+B+D) ÷3+C=34 (A+C+D) ÷3+B=36 (D+B+C) ÷3+A=44 汽车一般经过主火开关的电路是正极线吗?还有汽车上一般那些开关里是搭铁线,中控锁怎么安装的? 无水芒硝 1.2,3,6,36,( )A 48; B 54; C 72; D 1296 .2.6,13,32,69,( )A 121; B 133; C 125; D 130 . 匀速直线运动中速度决定位移吗? 如何使产品设计“简洁大气”? 用唯物论知识分析政府为什么推动家电下乡? KCR与MTR分别指什么啊 物理中说横截面积越大,电阻越小,可为什么保险丝是越粗越能承受的电流越大呢?问题就是这样的了. dont say lazy歌词请问谁有这个完整版的罗马音与中文的对照?.单独的罗马音也可以 找工作,起了一卦,六爻算的.卦象是睽卦.六次掷硬币,第一次,第三次,和第四次都是变爻.此卦怎么解? 感谢各位、但是我还没有看到更好的.类似 誓言割破嘴角 这样的网名 我会提高悬赏的 dont say lazy怎么读 白白2个字简写英文怎么写 “位移是矢量,位移与速度方向相同”这句话对吗? Na2O2的性质1.Na2O2高温下更稳定?2.在常温下,为什么Na2O也会反应成一点Na2O2? 光电效应中的电流方向是否与光照方向相反? 一个底面是正方形的长方体水箱,如果把它的侧面展开,正好可以得到一个边长是40厘米的正方形,这个水箱最多能盛水多少升? Na2O和Na2O2的性质 数学搜题中^是什么意思 政治试卷.高二的.求答案. 平面边界根据什么来求? 求教图中是否意思4组电流互感器 各互感器的绕组是2个?两图有什么区别呢,有一个有竖线,有一个没有 高二政治试题 平面中开集有边界点么? 直流电流互感器在CAD电气图纸中的表示方法交流电流互感器我们是这样表示的 材料讲的是物价上涨使农产品价格上涨,农民收入增加,市民支出也随之增加.用历史唯物主义知识分析:物价调控既要顾市民也要顾农民的合理性.手机党…字数有限制的话请分段写, 在盐酸与碳酸钠粉末反应前后质量测定实验中为何天平会有倾斜 为什么自己包的包子蒸好后皮很硬,而外面买的皮却很柔软.已经会发面了,不要复制原有的答案, 辨析:文化全球化必定使美国文化模式取代世界各个民族传统文化 天赐良缘 DONT SAY A WORD怎么样 写出猕猴桃在分类等级上所处的位置( ) 世界上最令人难忘的事是什么事? 沉默生机 DONT SAY A WORD怎么样 化学实验颜色对比我现在在做化学实验,滴定离子浓度,很多都需要颜色辨别是否反应完全,请帮忙提供一份化学实验的颜色对比的图片啊,主要包括:砖红色、橘红色等等等等! 童年的生活快要结束了.回顾童年生活,有许多难忘的故事.这些故事珍藏在我们的记忆中,串起了多姿多彩的童年时光.童年的故事带给我们许多欢乐,让我们一生难忘.让我们通过回忆,把童年生 细胞间信息交流方式,及所需结构 化学实验中说的实验结论是什么 1/2,1,1,( ),9/11,11/13 A、2;B、3;C、1;D、7/9; Say the word for each picture.中文意思 求一道数学趣味题的解abcd*e=fghiabcdefghi代表123456789,他们各代表的是多少? 化学实验分析和实验结论一些化学的习题让人填实验分析和实验结论,可是我搞不懂两者有什么区别. 图26为啥感应电动势为blv 我觉得磁通量没变化应该没有感应电动势啊 而且为什么是blv求解? 埃及多地爆发大规模反对军方游行墨西哥总统号召全民减肥印度开建“全球最高”塑像印度开建“全球最高”塑像 呼吁民众捐斯诺登找到工作 在俄社交网站上班英国检方称《世界新闻报》曾窃听哈里王“歧视胖子” 香奈儿艺术总监惹官司戴“谷歌眼镜”开车遭传讯偷渡客残杀5人 凸显底层华人困境普京登顶权势榜 只怪奥巴马不争气首个完整境外诈骗集团被批捕新一轮伊核对话可能取得重要进展奥巴马豪华座驾“野兽”细节曝光 具备印度真的脏乱差吗?撕去贴在印度身上的国际组织称:叙利亚已销毁化武设备挪威小镇人造“太阳”告别黑暗冬日(高小伙宁杭高速上搭不到客车 准备从南京温州街头有精神病史的男子挥刀挟持自己杭州男子因收入没妻子高将其推入河中淹金正恩或未会见到访蒙古国总统(图)日俄防长会前俄展军事肌肉 俄侦察机飞“盛桃”食品加工项目落户达孜工业园习近平春节前夕冒严寒踏冰雪慰问边防官拉萨市四川木里ML1.3地震四川汶川ML1.1地震云南香格里拉ML1.2地震四川汶川ML1.3地震春节期间新疆北部降雪 局地将降至零下美智库为机器人时代战争支招朱镕基为何成“时代礼物”:敢干 敢言第二届拉共体峰会在古巴召开宝乐迪KTV年底盘点:增势迅猛优势明世界杯参赛球队需要电脑游戏、浴液和杀居民大扫除扫出一把猎枪惹祸 6岁弟弟南昌西站公交线夜间将延时 接驳最后一万家灯火万家暖 一身风尘一身情 强卫疑“女友”与人开房 持枪逞凶去“捉奸迟浩田致信龚全珍表达深深敬意 龚全珍南昌长运部分长途班车29日起停开 2南昌景观灯启动“马年模式” 一江两岸景德镇一对老年夫妻相濡以沫恩爱生活6
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘