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

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

在DELPHI下读取与设置系统时钟 在Delphi中避免2000年问题的捷径 在Delphi中调用API函数 在Delphi中获取和修改文件的时间 在Delphi中控制扫描仪 在Delphi中实现对WIN9X应用程序使用权限的设置 在Delphi中实现对目录拷贝、删除和搬移的操作 在Delphi中使用自定义光标 在Delphi中用拼音首字符序列来实现检索功能。 在DELPHI中用线程排序 在Delphi中制作背景音乐 在Dephi中使用TStream读写数据的技巧-Delphi资料 在应用程序中跟踪MOUSE的坐标-Delphi资料 怎样建立回调函数-Delphi资料 怎样显示自定义鼠标光标(Cursor)-Delphi资料 找出消失的 Delphi 窗口 执行外部程序-Delphi资料 执行一程序并等待其结束-Delphi资料 制作一个不在任务栏及任务列表中显示的幽灵程序-Delphi资料 抓获全屏-Delphi资料 子目录级的文件查询的实现-Delphi资料 Delphi中ChartFX构件使用详解 Delphi中动画设计 Delphi中对Jpeg格式文件的处理... Delphi中多媒体组件使用解析 Direct3D起步:教程以及资源指南-Delphi资料 播放背景音乐-Delphi资料 弹出、关闭CD-ROM驱动器-Delphi资料 检测声卡存在-Delphi资料 控制声音音量-Delphi资料 让pc speaker美妙动听-Delphi资料 看了一下SL275(2001年5月)的课程概述,发现里面没有了Applet了,SCJP是不是舍弃了它了? 有关JAVA的Package,ClassPath的讨论,诸位看过来 COOL!COOL!COOL! what's wrong with the SOCKET define? 使用vb通过NotesSQL for odbc连接过domino数据库时总出现如下错误“ [Microsoft][ODBC 驱动程序管理器] 驱动程序的 SQLAllocHandle on SQL_HANDLE_ENV 失败”,有谁遇到过吗?如何解决? 在SDK中,如何判断对话框中的CheckBox是否选中? 请教如何修改如何提交数据(一对多的表) 如何在delphi里实现文件(比如文本文件)从一台机器传递到另一台机器?比较急! 不知道主板集成声卡的型号,又没有驱动程序?怎么办?主板是ASUS CUSL2,I815E CHIPSET 想问问大家pb自带的例子中有没有关于权限的例子 怎么样吧jpg图片转成ico?????? 听说程序员结婚生孩子多数会是女孩,是不是真的?,好像与辐射有关哦 那里有windoes版的ftp源码 不知道主板集成声卡的型号,又没有驱动程序?怎么办? 主板是ASUS CUSL2 ,I815E CHIPSET 请问哪里有编写多线程安全对象的资料?(72分) 通过界面输入大量数据,界面如何设计??? 在Red hat 7.1如何安装GBK字符集! Focus(老鱼)回答得50分 请教网站的建设计划如何写呀? 请问下面的DELPHI程序如何转为CB 帮忙测试! 怎样得到硬盘序列号 关于Web开发…… Notes Client 待办事宜的定时刷新问题 都是面向对象,怎么C++和JAVA对此代码的结果不同?欢迎高手讨论! 关于//{{AFX_??? 的问题 ---> 如何动态建立字符数组? 都是面向对象,怎么JAVA和C++对此代码结果不同?欢迎高手讨论! 如何解决线程函数与窗体的交互 vb+SQL2000的奇怪出错提示 请问怎么作出jar文件? 急!!!谁有RTF文件格式中元素说明?给一份!谢先!!!!70分奉上!!! java plug-in 1.3.1是什么东东?如何用? ASP中用foxpro数据库,删除记录的问题,我急。。。 急急急 兄弟我用HTML Help workshop 制作帮助,无法显示图片和默认页,那位来切磋一下好吗 怎么判断打印完毕和打印故障和取消打印的状态? php网络程式的问题。 用C++如何实现多进程ftp功能? 加了个硬盘,整个系统全乱了,怎么办? delphi 6手册组,我翻译好的文件无法上传,谁知道该怎么办? 我不想用第三方控件,如果我想使把Panel中的内容达到一个清屏效果(便如由上向下刷新,但最前有一些粉碎状效果,或是百叶窗什么的。) 有关异常的问题 如何用最简单的方法控制在数据窗口最后一列按回车键增加一行? 哪有ASP的技术手册呀?有关组件用法的 那位能有一个使用xpoint的应用?我不知道应该怎么用xpoint,有什么好??? 为什么我建立了两个读写线程,当频繁读写硬盘后,无法刷新界面呢? 再请教:如何得到浏览器的窗口的尺寸? 高分求助!!!怎样用VC在98下建立一拨号连接? 曾经的话题想改变命运的请走进来不想再说多少有自已看懂了的曾经在这里发过言的朋友可以和我联系,QQ12545029,scaer123@163.net socket编程,如何使connect()30秒超时???? 我到底怎么了?我上英语课和数学课时头就晕 什么也想不起.特别是做题时.我的生物是全班最好的我怀疑是我的智商有问题,我初一成绩全班前十名 现在初二我的英语降了很多分.数学更是搞不 what makes a really good party翻译 Mike's birthday is on next week对on next week提问 已知多项式ax²-bx+c.当x=-2时.它的值是0.当x=1时 它的值是0,当x=2时,值为8,求a,b,c的值 英语作文What makes me a good friend? I'm going to ___ (have) a birthday party next week. 已知多项式A=x²-x+b,B=x²-ax+3,且A-B=x+2,求a,b的值. 以“What makes me a good friend?”为题写一篇英语短文. Tom's going to have a birthday party next week.(改为反义疑问句)Tom's going to have a birthday party next week,_____ _____? 在一个非零无符号二进制整数之后去掉一个0,则此数为原数的()倍? What makes a good employee?作文怎么写?急100词就好 I hope Tina( )the birthday party next Sunday.A.to go to .B.goes toC.will have D.had 若在一个非零无符号二进制整数右边加两个零形成一个新的数,则新数的值是原数值的______.怎么算的?麻烦说下方法 数学题---晕外婆生日那天,妈妈买来蛋糕,苹果,桃子和橘子,已知蛋糕15元一个,苹果每千克6元,桃子每千克4元,橘子每千克3元,妈妈共花了41元.它们各买了多少? 已知a,b为常数,若ax+b>0的解集为x 如果在一个非零无符号二进制整数之后添加2个0,则此数的值为原数的4倍 2倍 1/2 1/4 小明用同样的速度先到外婆家,然后到小芳家.已知小明到外婆家所用的时间比到小芳家所用的时间多五分钟,请问他的平均速度是多少?注:小明——外婆家(558),外婆——小芳(248),小明— 已知a,b,c为常数,若ax+b>0的解集是x 如果删除一个非零无符号二进制偶整数后的2个0,则此数的值为原数4倍 2倍 1/2 1/4能分析一下吗 晕晕晕的数学题王林同学编制了一个计算程序,当输入任意一个有理数时,显示屏上的结果总等于所输入的这个有理数的绝对值与5的和.若输入-7,这时显示的结果是多少?如果输入某数后,显示的 a、b为非零常数,若ax+b>0的解集为x 若在一个非零无符号二进制整数右边添加两个0,形成一个新的二进制数,则新数的值是原数值的( )倍.若在一个非零无符号二进制整数右边添加两个0,形成一个新的二进制数,则新数的值是原数值 排列数A2n(在下)11-n(在上)+A n+4 2n= 根号16,根号8,根号4,根号1的通项公式是什么 请以 What a good friend should be like 为题 写一篇英语作文 80词左右 填空 Many people now think that teachers give students too m___ tests in class and too m___homework a___ school.So children do not have t___ for other activities.If teachers and parents t___to each other about the p___,they could work it o___ toget 怎样证明在(a+b)n次的展开式中,奇数项的二项式系数的和等于偶数项的二项式系数的和? what do you think a good friend should be like? 英语翻译:如今中药在许多西方国家很受欢迎._____ _____is now_____in many_____ _____. 设ab为常数,ax+b大于0的解集是x小于四分之一,求bx-a小于0的解集前面的a b是分着的,非乘积形式 what do you think a good friend should be like? 英语翻译2.the list of goods and closing time3.The marketing and accounting offices are on the secong floor.And we have many other departments:personnel,research,ete.4.I sell all kinds of things.And the shop stays open longer.5.They may crash beca sleep 的相关短语 找一篇关于“what did of friend do you think is the best?"的英语文章100单词以上 I think there are too many rules in my home 哪里错了还有Tom doesn't like math,too.哪里错了 英语翻译Help! 头都算晕了的数学题A公司 欠 B 和 C 两个全部货款 6335A公司 单独欠 B 2932B 又单独欠 A公司 800 租金B 和 C 两人共欠 A公司 5010问:收回A公司全部货款后 B和C各该分得多少?谁算得出来这个题 英语翻译Do you think there is too much noise in our city?Perhaps you do.If you live near an airport,you will probably feel unhappy because of the noise of jet planes(喷气式飞机).It is said that the noise of planes or trains or trucks can 有词组ee并且发音为i:的单词有哪些?至少7个,如see,sleep,tree. 根号十六分之四十九 是多少 计算根号1又16分子9+根号4又36分子25的值为什么?A,2又12分子5 B,3又12分子5 C,4又12分子7 D,5又12 go to sleep=那个短语go to sleep=____ _____ 丽丽和兰兰都有一些口算卡片.丽丽给兰兰18张后,两人的口算卡片同样多.原来丽丽的口算卡片比兰兰的多几张?看样子真理总是占在人多的哪一方面,我算的是18,我错了. 计算根号下36*25= 根号下(-15)*(-27)=化简:根号下81x的平方y的三次方 根号下8a的三次方b的四次方c的五次方(要过程) sleep a little longer 翻译词组 英语作文 Good manners要80字左右的英语作文 一道初一下的数学题,我算晕啦!设:A=2x的2次方-3xy+y的2次方-x+2y,B=4x的2次方-6xy+2y的2次方-3x-y,若|x-2a|+(y+3)的2次方=0,且B-2A=a,求A的值!过程啊 根号下4+25怎么算加减的运算法则是怎么样的,忘记了 -4/3根号8/(2根号8*1/3根号6) 怎么算5个二进制位表示无符号整数的范围是多少 计算:根号下4+根号下25-根号下100 根号12-根号6*根号8+(1+根号3)(1-根号3) 1.用10个二进制位表示无符号整数时,可表示十进制取值范围是多少?2.7位补码可以表示最小1.用10个二进制位表示无符号整数时,可表示十进制取值范围是多少?2.7位补码可以表示最小的数是什么? 求2n元排列2n 1 2n-1 2 2n-2 3 2n-3 .n+1 n的逆序数. 我的头非常晕用英语怎么说 一个8位二进制数,能够表示的最大无符号整数是多少我是这么想的.无符号 8位二进制 全部表示整数 也就是11111111=511 最大整数是511 为什么 书上答案是255啊.求指教 为什么我在做数学题时我头会痛,还很晕 我已经头很晕了 英语怎么说? 多项式ax²+bx+c在x为1、-1、2时,它的值分别是-6、-8、-11(1)求a、b、c的值(2)当x=-4时,求多项式的值 it's( )birthday next week
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn