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

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

在VB中制作单独程序封面的两种方法 在VB中制作透明按钮 在Visual Basic中如何拖动窗体或控件 在Visual Basic中显示动态运行进度 在菜单中加入图标 -VB资料 在程序中调用关闭Windows对话框-VB资料 在任务栏中显示无边框窗体的图标-VB资料 在系统菜单上添加自定义菜单项 -VB资料 在运行时动态生成多个相同的控件?-VB资料 在最小化状态时提供提示 -VB资料 暂时禁止窗口更新-VB资料 VB怎样得到文本框(TextBox)中的文本行数? 制造出透明的Form -VB资料 VB制作半透明窗体和形状不规则的窗体 VB制作方向按钮 VB制作渐变的窗口背景色 字体闪烁 -VB资料 自动改变控件大小-VB资料 自制IE风格按纽控件-VB资料 VB6.0中通过MSChart控件调用数据库 用VB6实现动态增减控件 ActiveX控件的创建-VB资料 ADO控件和DATA控件的冲突(不能共存)的解决方法-VB资料 Combo的自动查询技术 -VB资料 DirectX7.0使用心得(1) -VB资料 DirectX7.0使用心得(2) -VB资料 DirectX7.0使用心得(3) -VB资料 FSO对象模型在VB中的应用 MsComm 控件的文字传输范例 -VB资料 Office或IE4风格的ToolBar -VB资料 Regsvr32.exe注册控件的具体用法-VB资料 请高手帮忙!一定给分! 怎样编程实现在ListBox里显示数据库表中一个列?(绝对放分) 那位有《101规约》给我一份,我实在不知道该到哪里去找!!!(50分求助) 关于对话框制作 关于例外 给Cisco认证提点建议!给分===== [求教]XML文档的参数中如有&符号如何处理。 [求教]XML文档的参数中如有&符号如何处理。 谁能给我提供免费防刷新的计数器代码……在线等待 请问出现下列错误,如何解决!(怎样察看每个OLE DB状态值) 会话状态设置中的SQLServer 模式如何应用? BUG!版主管理里的专题管理 session 没设置正确,请蝈蝈看看 有朋友问我学习C语言初中学历能学会吗? 大家帮个忙,很简单的问题,快呀,关于数据库的问题 请问vb怎么打开Access2000的数据库? 计算机并行口原理是什么 我在前台的程序中对text1.text=rs!number,为何text1.text的值还是空值,想不通??? GetSafeHdc() 的含义及用法 一个调用SQL数据库的问题! 如何ML一个装载地址不是4M的EXE文件(比如6M或8M) 谁能说说从一个ListView拖动文件到另一个ListView中 如何在程序结束时播放一段动画再结束!!!!! 我要书 下面是我的存储过程,为什么多人操作的时候会发生死锁呢,急呀! 谁知道炖鸡怎么炖啊?加什么料? 如何使鼠标点到对话框外时关闭对话框?(方法越多越好) 国家安全部门使用什么操作系统? “用户级虚拟机”调试应用程序的有几种实现方式,谁能说说???? 如何优化程序,使他减小占用系统资源? 请问怎样同时显示简体和繁体汉字? 我想查找字段为'注册类型'中包含'公司'的所以有记录 帮帮忙,SQL Script Recovery如何获得注册码? 如何“引用结构中的结构的数据”,比如MSG中的POINT鼠标结构 用一个Query动态生成并执行SQL语句 哪里可以下载到有关oracle 9i的电子书? 存储过程生成的数据窗口,如何在窗口中直接使用 prc扩展名的文件如何打开? 用vb在任务拦里靠系统时间的地方自己的程序添加一个图标用什么函数? 我用100分来搜集图形处理编程的网站及经典介绍。 请问哪儿有整理c++代码的源程序下载? 为什么这个NOTATION声明有错 如何在c语言里面定义快捷键 如何在c语言里面定义快捷键 如何用php实现全屏打开一个窗口??? 在线求救,SQL的sqlserver.exe进程怎么会无限增大直至系统瘫痪!SOS! MEMO中的光标 如何全选DBGrid中的所有记录呢?? 请高手帮忙翻译一下"" 在线等待,有分给哟! 我来提个问题:如何获取焦点所在控件(在另一应用程序上)的句柄? 为什么不能编译? 怎样知道共享上网中具体一台机器的IP地址 请懂的人翻译 “思念的感觉是难受的” 英文 英语口语课前演讲稿 3分钟以内英语口语课课前演讲稿3分钟以内希望题材是大家都感兴趣 新颖的最好可以留下好印象的 温暖怀抱的形状答案说说题目的含义第4段“坐在马上的我,却惊诧不已”,我“惊诧不已”的原因是什么第8段老师说“你看,连蒲公英都要等种子成熟了,才让他们飞走”,老师的言外之意是什么 帮忙翻译一下: "我主要负责什么什么工作",这句话用英语口语怎么说还有就是"喜欢听英文讲座" 这句话英文怎么说.比如说: 我主要负责服务器维护方面的工作 这句话英语口语怎么说? 如何用英文介绍Tracy这个英文名 Enjoy your life 怎么读? 英语翻译你知道吗,我真是爱死你这迷人的笑容了!你的笑真是迷人得要死!(跟第一句要有很大不同哦~) 你这是要干什么,我们不是一直都好好的么!我真是受够你了,你有对我好过吗!你什么时 tracy在英文名中的含义 谁知道"enjoy your digital 我可以和你做朋友吗? 请翻译成英语,谢谢. I am shocked by the lack of manners that most kids have nowadays as well as the lack of consideration by adults, Very few people are actually concerned aboutissues that areaffecting our world today求翻译啊 30分!一个平行四边形,底是12厘米,比高长20%,这个平行四边形的面积是多少平方厘米?一个平行四边形.底是12厘米,比高长20%,这个平行四边形的面积是多少平方厘米?我明天要交.为了你心爱的分数 Close to Heart 歌词 有关过年的英语作文带翻译{最好是原创} 谢谢各位帮帮忙~ 初中水平~带上翻译 谢谢 我想要一篇3分钟以内的演讲稿,题目是《如果可以》中文的.还有一篇英文的,《tears behind the smile> 翻译:我可以经常邀请许多朋友来家里玩 英语翻译 憎恨和报复社会 我可以和你做朋友吗? 我的世界没有人懂!我总是感情用事.因事而易感伤.我懂得生命中坚强的意 义.为此而努力做到让 自已坚强.让身边的人坚强.但在灾难来临时.脆弱的人首先是我..脆弱的是我的内心.我已在心里 我对这个社会极度不满,我想报复社会,这个社会太不公平,我他妈的就想杀人.我没有朋友,我的家人也不理解我 fighting的正确读音?知道这个单词是看《浪漫满屋》但是发现这个读音有两种:有的读:fai ting 有的读:huai ting!到底哪一个发音才是正确的?是不是韩国人就把fighting 读成:huai ting 按照英语的 文化东路英语怎么说 罗斯福总统是如何受到仆人爱戴的 long time no see .what 's new?how do you dohow are you nice to see you hi i have bought a new car 迪诺英语 文化东路店怎么样 大学英语口语大赛3分钟演讲稿子我是大一学生,参加英语口语大赛决赛急需3分钟演讲稿,最好有气势一些, Long time no see,my friend.What's new? 英语翻译如题,想翻译地址,所以举了个例子;请问宝山区通河一村1号101室怎么翻成英文? 罗斯福总统简介 cause sb to do要准确的 平行四边形的底是高的3倍,底与高的差是12厘米,这个平行四边形的面积是( )平方厘米. 罗斯福当了几年总统? 有cause sb.to do 的说法吗RT 如果我不选择堕落,地狱的存在有何意义`这句话的另一种解释是什么? 罗斯福当了几届总统 cause sb to do和make sb do的区别比如 It seems that computer crimes have caused many banks and companies to lose a large sum of money.可以换成make……do……的形式么 英语舍不得放手怎么说? adversity is a natural part of life,and must be accepted.翻译 cause sb.to do 舍不得放手怎么办啊 德语“亲爱的”怎么写?对男的说 帮忙看看这句话有语法错误么目的是有助于读者对有关问题的了解度或认识度有所提升.主谓宾 定状补什么的~ 英语翻译1 《温暖的扑克》阅读答案 李丹崖写的1.文章叙述了一件事,从不同的角度可以作不同的归纳概括.请你按照下面的要求作简答概括.(1)白衣女孩:(2)老爷爷:(3)我和朋友:2.读下面的句 英语选择题We‘ll have a party tomorrow,I don’t know A.what to wear B.how to wear如果我用How的话这句话应该怎么说? 因喜欢而舍不得放手的成语 温暖的扑克,快,答对了我的分很高7、本文叙述了白衣女孩的一件什么事?请你用简洁的语言概括.(2分)8、“就在我们走到拐角的时候,一个六旬左右的老伯突然蹿出来拦住了我们.”句中加点 这句话有语法错误吗?Participate in the two projects,complete the PLC programming.如果有,请帮忙改正,恩,对的 我想去海边走走用英语怎么说 have to do sth 句型造句 I don't know what I should wear at the party.I don't know what ____ ____ at the party. 我最愉快的事情就是去海边用英语怎么说 have sth to do的造句 He doesn't know what_______(wear)to the party怎么改,为什么? 我将要去海边.用英语怎么说 温暖怀抱的形状, 浅唱那无人懂的悲伤翻译成英文 怎么写? 急需一片3分钟之内的英语口语演讲稿, 爱是温暖怀抱的形状阅读题答案 1.“哈桑大惊,匆匆把马拴在树上,只满怀歉疚地向我说了声对不起,便一头钻
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘