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

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

前富士康CEO程天纵:创新来自长尾,创业源于创客! 最危险的开源项目——比特币 11月20日:微软正式发布Windows 1.0 回顾历代Windows版本界面 微软CEO鲍尔默卸职前在股东会上的最后演讲 微软改革员工排名制度或将开启新篇章 【快讯】SAP联合中国电信,又一外商公有云曲线入华 微软CloudOS云操作系统构建企业级三云合一 IE11支持JavaScript新型API,Web应用国际化更便捷 谷歌推订阅应用Play Newsstand:杂志+RSS阅读器 【信息图】到2020年开发者、设计师、测试员的数量将达到史无前例的高度 推广与盈利专题论坛:中国影响世界,世界定义中国 SlideIdea CEO李建忠:移动产品的技术面思考 BDTC→→百度林仕鼎、腾讯蒋杰、阿里唐洪论道大数据平台与技术 谷歌首席互联网布道师:隐私保护并不是一种正常行为 微软公开“挑衅”谷歌,出售反谷歌标语T恤 四大UX设计原则,打造网站最佳浏览体验 【BDTC讲师】黄晓庆:从小灵通到Hadoop与实时大数据分析 【BDTC讲师】杨强:从禽流感预测到图片语义解释 2013中国大数据技术大会讲师议题正式发布 “2013中国大数据周”即将开幕 正式发布中国大数据现状白皮书 搜狐畅游发布3D游戏引擎Genesis-3D 基于MIT协议开源 传闻微软将收购AOL旗下的Winamp和Shoutcast 【BDTC讲师】大数据时代“掘金机”:百度、360、一淘搜索技术分享 谷歌董事长:审查,将会在十年内消失 50万奖金+天使投资:创维天赐家庭互联网创新大赛开幕 专利案苹果获胜:获赔2.9亿美元 三星不服将继续上诉 Google正打造Spark:一个基于Chrome App的集成开发环境 研发周报:成为一名PHP专家其实并不难 将Vistual Studio打造成为Node.js IDE 度量Web性能的关键指标 路由器未火够!高通发布互联网处理器 !!!用ASP能否实现一次上传一整个目录下所有的文件(子目录不算)?高手请答复! TreeView专题讨论 j2me中请问如果将textField中的内容写入到moto388手机的记事本中? 在vc中调用其他的exe include 另外一个jsp文件时,能向那个文件传参数吗?不能的话,有其他办法吗?谢谢 系统不能识别DaysBetween,如何处理 请问如下通过web连续下载图片,只是第一张要提示,以后每张就不再提示了? 关于ADO驱动MDAC版本的疑问 兄弟要工作了,是不是只要见到领导都要打次招呼? 我的问题!! 最近在用MFC写GDI程序,请前辈们给点建议 老兄给一些建议啊!用VB做什么毕业设计比较合适啊? 急,获取主板信息的问题! 请教finder的排序问题 mysql对一个数据库中表的数量有没有限制? 100分,急求控件的编写方法~!!!!我在做的项目想用到类似于vc编译器左边的class,resource,file view的窗口控件,谁有? 为什么我收到的邮件列表每次都是乱码?怎样打开? 大家帮看看这段代码哪出问题了,在线给分 求高效统计算法(在线等待,采纳着需要分来信200) 怎样将bcb中vcl 及其他组件改为activex??? 微软的面试题 treeview 控件在客户端的操作? 怎样在程序里找无标题的DLG! j2me中请问如果将textField中的内容写入到moto388手机的记事本中? 谁可以和我说一下LINUX是如配置的! 请问:如何在java通过xml文件和他的schema,既得到标签里的内容,有能够知道内容的类型 已修改的列 C++Test讨论区 菜鸟提问,大家不要笑我啊! 这里还有人在用Java IDE工具JawaBeginer的吗? 有谁知道aspopup控件的功能和作用--在线等待 100分,急求控件的编写方法~!!!!我在做的项目想用到类似于vc编译器左边的class,resource,file view的窗口控件,谁有? 简单的菜鸟问题!! 如何写WPE这种类型的软件? 向DX请教两个开发上的问题,请不吝赐教! java中字符串数组,转化为javascript数组,jsp页面显示为乱码,代码如下: 小问题一个 有关QuickStart中示例 求SQL语句,一表值通过另一表更新 关于activebar 2。0 请问哪个中译英的免费软件好一点啊? 大虾救命:TCP编程的客户端端口占用问题 关于记录集的关闭! 本人现在做一个例程时遇到问题,编译后什么反应都没有,请教~~~~ 参数传递问题 刷新 LPCSTR在哪个文件里定义的? 如何判断一个存储过程已经存在??(在线) 关于TOMCAT的配置问题? datawindow的checkbox里可以放图片吗? 关于COMS的问题 interbase 数据库损坏???? 为什么真空包装可以防止细菌产生 5分之3ab的系数是 请在这里概述您的问题 我懂得了.看见了大海,我懂得了浩瀚; 看见蓝天,我懂得了辽阔; 看见小朋我懂得了.看见了大海,我懂得了浩瀚; 看见蓝天,我懂得了辽阔; 看见小朋友,我懂得了友爱 一平方等于多少米? 高温杀过菌 真空包装的中药液能放多久我拿了一个月的量 治疗慢性浅表胃炎的 不知道能不能放一个月 证明函数y=x+1/x 在(1,正无穷)上是增函数 放鹤亭记的翻译 什么细胞器含有的DNA最多?为什么? 证明函数y=x+1/x在(1,正无穷)上为增函数 英语翻译问段中所描写的鹤的特点 含有DNA的细胞器同题细胞结构中科院发生剪辑背对行为的一组是细胞核线粒体叶绿体中心体,线粒体叶绿体核糖体高尔基体,细胞核核糖体中心体高尔基体,线粒体叶绿体核糖体细胞核。 证明函数 y=x+ 1/x在区间[1,+无穷)上是增函数.rtrtrtrt 要给这个长、宽、高分别为x、y、z的箱子打包,其打包方式如下图所示,则打包带的长至少要()(填写算式和答案)(单位:mm).(用含x、y、z的代数式表示) 禁止静脉注射 药物有哪些 340米每秒分之S减5000米每秒分之S等于2秒,怎么算?求说的详细一点 放鹤亭记原文及翻译 发生在英国伦敦的故事谁知道发生在伦敦的一些故事 E=ΔΦ/Δt中分子等于B*S他们两项均是变量行吗,为什么 sas中平均值差异性检验!已知两个样本 :样本含量分别为 150 和100; 平均数分别为7.48 和7.41,方差分别为0.48 和0.69.检验两者平均值差异是否显著,用sas中的insight和analysis模块可以完成吗,还是必 英国伦敦有什么传说故事和风俗习惯 一辆汽车在a(s)内行驶6分之s米,则它在两分钟内行驶多少米.初一数学资源学案上旳题,答案被撕了.= = SAS ADF 单位根检验 平稳性 结果因为P小于0.0001所以是平稳的?这图还能看出什么?如果可以,可否帮忙解答下RHO,Tau的数值有什么意义, 关于伦敦历史英语故事伦敦历史英语故事 那些建筑,名胜的英语小故事 1.2.3.4题,谢谢,数学 SAS时间序列分析 二次函数的对称性是什么 (我的世界 求大神解一数学题已知函数f(x)=2x(1)若函数F(x)=f(x)+af(2x)( 有些螃蟹的足折断了还能再生出来,这种细胞的分裂方式为A无丝分裂 B有丝分裂 C减数分裂 D分裂生殖这种什么方式该怎么看呐,我怎么知道它是有丝还是无丝还是减数呐? 已知变量X,Y 满足{X≥1,Y≤2,X-Y≤0.则Z=X+Y 的最小值为 ( )求图像!X≥1,Y≤2,X-Y≤0 求图像. 硫代硫酸钠的推注和静脉注射有什么区别 在生物学上,生物的生殖是为了本身的什么?晕 我的意思是种族的繁衍是为了什么?并且是在生物学上.以生物学的观点来叙述这个问题,种族繁衍谁都知道. 已知变量x,y满足条件{x 已知函数f(x)=3sin(wx-∏/6)和g(x)=2cos(2x+φ)+1的图像对称轴完全相同若x∈[0,∏/2]则求f(x)取值范围和φ的取值,托大家的福. 生物的生殖使生物的——和——得以延续 用定义证明函数f(x)=1-1/x在(0,+∞)上是增函数. 动脉注射和静脉注射的区别在那里如题 二次函数的对称性(对于一般式) 谁能给几张玻璃之唇的壁纸啊 既是DNA载体,又是具有复制能力的细胞器是 二次函数都有对称性吗 两个一元二次方程应用题!如图 ,要设计一副宽20CM,长30CM 的图案,其中有两条横着的彩条,和两条竖着的彩条,横竖彩条的比为3:2,如果要使彩条所占面积是图案面积的四分之一,应如何设计彩条 函数题, 1952年的英国伦敦光化学烟雾事件用英语怎么说如果知道事情梗概的最好能用英语大致介绍一下,三两句话就可以. 点p(-2,6)关于y轴的对称点到原点的距离为 注射用核糖核酸Ⅱ可以静脉滴注吗?用多少液体加?因为产品说明上写的静脉注射和肌内注射 判断题:1.一根绳长4/5.() 2.两个数素数只有公因数1( ) 3.两个数的公因数的个数是无限的4.最.判断题:1.一根绳长4/5.( ) 2.两个数素数只有公因数1( ) 3.两个数的公因数的个数是无限的4.最 一个凸多边形共有20条对角线,它是几边形? 函数题一道, 科学家可以发明时光机吗 (急)数学难题:一个凸多边形共有20条对角线,它是几边形?是否存在有18条对角线的多边形?如果存在它是几边形?如果不存在请说明得出结论的道理. 把一质量为0,8kg的木块轻轻放入盛满水的烧杯中,当木块静止后溢出的水收到的重力为 N,如果木块的密度为0.8*10的三次方kg/m³,要将木块浸没在水中则在木块上施加一个大小为 N,方向 的力.( 五分之S的系数为五分之一,次数为1,为什么? 浦东新区2012学年度第二学期5月教学质量监测九年级数学(月考答案,2013年5月的)答案最后三道需要解题过程 高中数学必修5的余旋定律的题:a^4+b^4+c^4=2c^2 则角C等于? 正弦线是什么意思 简单的一元二次方程应用题一桌面长6米、宽3米,铺在桌上的台布的面积是桌面面积的三倍,并且各边垂下的长度相同,求这块台布的长和宽 人教版 第99页 第2题已知a>b>c,求证:(1)1/a-c1/(a-c)^2急用、谢了. 高一正弦定义题在△ABC中,已知AB=4,AC=7,BC边的中线AD=7\2,那么BC=_____ 蓝天如同浩瀚的海洋;白云________入团那天,春光融融,蓝蓝的天上飘着白云,校园里绽放着鲜花,团旗映着我们的面颊.那一刻,我的心里,蓝天如同浩瀚的海洋;白云___________________;鲜花犹如我们灿 美无人机干掉巴塔头目 巴怒斥其炸死和美妇人送儿子手机前“约法18章” 网古巴政府叫停私营影院 称“不是倒退”[实拍]中国新型“中华神盾舰”吊装导埃及前总统穆尔西出庭受审:从囚徒到总法两名记者在马里遇害 遗体遍布弹孔(美媒爆料日本系美监控对象 目的不仅限各国学校扎堆北京招生(图)俄罗斯严防“黑寡妇”袭击 确保冬奥会祭拜烈士墓 金正恩:“心疼得睡不着觉金正恩参谒牺牲烈士墓地 称心疼得睡不从奥巴马借助大数据成功连任说起美国一位妈妈送13岁儿子手机前“约法人民币升值,钱却为何越来越不值钱埃及审判穆尔西或将引发新的流血冲突俄罗斯:严防“黑寡妇”袭击 确保冬奥俄称斯诺登可去德国协助调查窃听事件泰国沉船事故致一中国人遇难 渡轮超载苏格兰首席部长访华 推动双方经贸合作苏格兰首席部长访华 推动双方经贸合作缅甸穆斯林赴邻国避难遇海难 或死伤惨“一带一路”上谱写中阿友谊的“欢乐颂拒绝承认中国市场经济地位是战略错误中美科研团队揭示黑碳对雾霾和气候变化科学谋划我国食品安全战略的基本框架山西交响乐奏响曼谷城党建“标准化” 聚力促发展一半获身份难民可在德就业今年1至4月赴泰中国游客突破360万运用大数据提升地方政府治理能力网络空间治理应着力保障公民权利拉脱维亚将成为经合组织最新成员国泰盘谷银行发行首张银联标准借记卡伦敦举行粗花呢复古骑行活动加大惩戒力度,使“两面人”无处可遁新时期怎样做合格的共产党员汉语元素进入新版《牛津英语词典》强化问题意识 突出问题导向北京大兴区工商联:“党员是我们非公企厄尔尼诺在搅局吗第十二届世界徒步大会秦皇岛举行贷款少增不代表实体经济支持力度下降
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘