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

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

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

作者:Android开发网


  今天我们继续就Android DDMS源码一起分析NIO非阻塞通讯方式,Android123也会给大家分享下手机和PC互通中的一些技术。在NIO中有关SocketChannel和ByteBuffer的使用细节,可以在今天文章中

   static void read(SocketChannel chan, byte[] data, int length, int timeout)
            throws TimeoutException, IOException {
        ByteBuffer buf = ByteBuffer.wrap(data, 0, length != -1 ? length : data.length); //从字节数组中实例化ByteBuffer
        int numWaits = 0;

        while (buf.position() != buf.limit()) {  //循环接收数据
            int count;

            count = chan.read(buf);
            if (count < 0) {
                    throw new IOException("EOF"); //读到末尾
            } else if (count == 0) {
                if (timeout != 0 && numWaits * WAIT_TIME > timeout) {
                    throw new TimeoutException();
                }
                 try {
                    Thread.sleep(WAIT_TIME);
                } catch (InterruptedException ie) {
                }
                numWaits++;
            } else {
                numWaits = 0;
            }
        }
    }

    有关SocketChannel的写操作,就是发送数据代码如下:

  static void write(SocketChannel chan, byte[] data, int length, int timeout)
            throws TimeoutException, IOException {
        ByteBuffer buf = ByteBuffer.wrap(data, 0, length != -1 ? length : data.length);
        int numWaits = 0;

        while (buf.position() != buf.limit()) {
            int count;

            count = chan.write(buf); //发送数据从ByteBuffer中
            if (count < 0) {
                       throw new IOException("channel EOF");
            } else if (count == 0) {
                             if (timeout != 0 && numWaits * WAIT_TIME > timeout) {
                            throw new TimeoutException();
                }
                 try {
                    Thread.sleep(WAIT_TIME);
                } catch (InterruptedException ie) {
                }
                numWaits++;
            } else {
                numWaits = 0;
            }
        }
    }

   有关ADB如何选择一个具体的设备,可以使用 setDevice 方法,这样当电脑中有模拟器或链接了多个手机,可以通过设备序列号,选择需要通讯的设备。

  static void setDevice(SocketChannel adbChan, IDevice device)
            throws TimeoutException, AdbCommandRejectedException, IOException {
        // if the device is not -1, then we first tell adb we're looking to talk
        // to a specific device
        if (device != null) {
            String msg = "host:transport:" + device.getSerialNumber(); // 最后的获取序列号,android123提示大家在adb命令中是adb get-serialno

            byte[] device_query = formAdbRequest(msg);

            write(adbChan, device_query);

            AdbResponse resp = readAdbResponse(adbChan, false /* readDiagString */);
            if (resp.okay == false) {
                throw new AdbCommandRejectedException(resp.message,
                        true/*errorDuringDeviceSelection*/);
            }
        }
    }

    通过PC控制手机重启的代码,当然这里需要Root权限才能执行

   public static void reboot(String into, InetSocketAddress adbSockAddr,
            Device device) throws TimeoutException, AdbCommandRejectedException, IOException {
        byte[] request;
        if (into == null) {
            request = formAdbRequest("reboot:"); //$NON-NLS-1$
        } else {
            request = formAdbRequest("reboot:" + into); //$NON-NLS-1$
        }

        SocketChannel adbChan = null;
        try {
            adbChan = SocketChannel.open(adbSockAddr);
            adbChan.configureBlocking(false);

            // if the device is not -1, then we first tell adb we're looking to talk
            // to a specific device
            setDevice(adbChan, device);

            write(adbChan, request);
        } finally {
            if (adbChan != null) {
                adbChan.close();
            }
        }
    }

  我们可以看到基本上,每个命令的执行,都是用了单独SocketChannel通过非阻塞方式执行,这样大大加强了并发,所以DDMS可以一边处理Logcat打印,显示堆信息,处理文件管理等等,有关NIO服务器的内容,Android开发网将着重分析MonitorThread.java这个文件,一起说下NIO的框架。

在DBGRID中实现COPY、PASTE功能-Delphi资料 在Delphi程序的About窗口中建立URL连接 在Delphi中利用Tbatch组件完成数据批处理 在Delphi中巧改窗体文件实现控件数组化 在Delphi中实现不同风格的SPEED和BUTTON 在Delphi中实现类似VB中的控件数组。 在RichEdit中的串查找-Delphi资料 在按钮中快速启动程序-Delphi资料 怎样读出MEMO控件的当前值-Delphi资料 怎样使用Delphi 5中的TExcelApplication操纵Excel 97/2000 怎样在TDataset中汉英混用-Delphi资料 制作可移动的窗体的MovePanel控件-Delphi资料 制作可移动的分割窗体-Delphi资料 制作用于日期时间型字段的DELPHI数据感知控件 制作主窗口显示前的版权窗口-Delphi资料 状态条插入可视控件-Delphi资料 做动态显示的控件-Delphi资料 做一个OpenGL控件-Delphi资料 Api函数列表——与打印相关-Delphi资料 Delphi 5快速创建控制面板程序 Delphi 编写Windows NT服务 Delphi 的 分 发 工 具 ─ ─InstallShield Delphi 关于系统编程中的技巧 Delphi3如何调用Excel Delphi5.0中的函数调用模式 用Delphi 编 程 时 如 何 利 用 线 程 Delphi的8个技巧 delphi函数参考手册 DELPHI键盘常用快捷键汇总(DEFAULT 和CLASSIC) Delphi实现自动切换输入法 Delphi使用汇编 asp.net开发环境的总题。 有人玩传奇吗?有疾风站的吗? 能否用程序来实现对数码相机的控制,如果可以该怎样做? 如何使窗口最大化!不是最大!!!!! 一个游戏编程的绝好网站!!! 谁能帮我解释一下下面的样式单什么意思?一定给分!!! 我用telnet 127.0.0.1 25不能登陆,110端口也是这样 有汕头的哥们吗? 大家晚上好,怎么让我的程序里有一小块是网页的内容呢?(我很穷,呵呵) 请教各位大虾:如何把数据库的两个字段分别设置成Tdbchart的横坐标和纵坐标?小弟急用~~小弟急用~~小弟急用~~ 联众网络游戏是用什么语言写的? 有关使用DirectShow开发TV Capture的问题 如何声明和使用自定义对象(如:Tdadaset)的事件?? PB的数据窗口中GerRow()得到的不是具有焦点的行,如果我要想的到具有焦点的行,应该用什么东东 有关使用DirectShow开发TV Capture的问题(一定给高分) 在VB中能否将时间格式化为显示出毫秒来? 寻求驱动 如何给回答我问题的人加分? 如何在mshflexgrid中输入字符 如何改变当前打印机的纸型? 请问在WINXP下的怎设置IIS? 我在用 DataReport 控件对数据库进行输出时 为什么运行时总是弹出选择数据库的对话框? 这个数据库连接不是已经设置好了吗? 怎样取消textbox的凹凸感? 为什么在IE6 中使用Ctrl+Shift组合健得到的连接是http://www.china.co.cn 为什么总是出现Invalid BLOB handle in record buffer错误 大家晚上好,怎么让我的程序里有一小块是网页的内容呢?(全部家档!!) 关于Database和Session的问题!火急!(快乐的程序员) jsp+mysql如何在linux上配置 有知道黑龙江高程查分方法的吗????? *******我要一个这样的类:显示淡入淡出的菜单(最好还能有半透明的功能) *************** 特急,各位帮忙。怎么样在字符串中包含'(单引号)? 高分求助用paradox数据库保存JPEG图片的代码,我试过网上好多都没成功。markoni@21cn.com 吴文智、袁飞、Jinesc、Jneu、Amoon、ttyp、icevi、progame 快请进 请教一个表与表之间比较数据的问题,由于数据量大,造成事务不够,请教解决方案 execcommand的使用方法求救。高手请进,一定给分。 我的时钟怎么回事? Matlab论坛 打印机的取消按钮 dbgrid中当某个单元格失去焦点时触发什么事件? 关于Database和Session的问题!火急! yanxu1 学习unix下的c编程,该如何学?请介绍方法,资料什么的--我对unix和c都还熟悉。 打印机死机作何解?????? 我是新来的,请各位大哥、大姐们多多关照!!!(有内容) 再次发问关于sql server7的问题?? SQL SERVER中的一个触发器的问题!!! xml里有什么method可以取得子节点在父节点中的位置(序号)? please help me 怎么样才可以把系统存储过程的结果写到结果集里? 如何声明和使用自定义对象(如:Tdataset)的事件(beforecancel)?? 一个奇怪的问题? 鑫鑫商店运进150箱纯净水,每箱24瓶.第一天卖出这批纯净水的1/5,第二天卖出这批纯净水的2/5,其余的第三天全部卖出.第三天卖出纯净水多少箱? 购买120号汽油上海哪里能买到120号汽油呀?做药品杂质检测中要用到的,可能用的量也不是很多我也是被折腾死了,问了好多都没有,加油站也问过。可是实验要用也没办法,关键还是量很少 一桶汽油用去7分之4,到加油站后加紧4千克,这是桶里的汽油正好有一半.这桶汽油原有多少千克! 鑫鑫商店云锦150箱纯净水,每箱24瓶.第一天卖出这批纯净水的五分之一,第二天卖出这批纯净水的五分之二其余的第三天全部卖完.第三天卖出纯净水多少箱? 90号汽油里能填一点120号汽油吗小型轿车,能在90号汽油里掺点120号汽油吗?可以单独用120号汽油吗,会对发动机有什么伤害? 盛有水的一个长方体容器,它的长3分米,宽2.如果放入一个土豆后水面上升0.4分米土豆体积多少 一桶 纯净水,第一天学生喝掉了他的4分之1,第2天又喝掉了他的5分之1,剩下的比喝掉的还要多2千克,这桶纯净水重多少千克 一件服装的售价是264元,盈利率为百分之20,那么这件服装成本价是多少? 一个长方体容器,里面量长宽都是2DM,向里面倒5L水,把一个土豆放入水中,这时水面高13CM,求土豆体积?RT,求,要算式! 顶级手工ZIPPO在淘宝上看到叫这个名字的顶级的zippo,蛮贵的,600多个大洋呢,确实挺好看的,盘龙的样子.有谁买过没? 降香油是什么冠心丹参滴丸里含有降香油,吃后感觉口腔不舒服,降香油是不是损伤口腔黏膜呢? 一个长方体容器,底面长3分米,宽2分米,高4分米,装满了水,放入一个土豆,溢出的水体积是1.8升,这个土豆的体 如果一种商品的成本价降低10%,而售价不变,那么盈利率将提高了15个百分点.求该商品成本价降低后的盈利率 麻油党是啥意思经常听人提到麻油党,不知啥意思,请知者赐教 有一杯1升水 第一次倒出1/2,第二次倒出的水量的1/2升的1/3 第三次倒1/3升的1/4...到了10次后 还剩几升? 聪聪把一些土豆放在底面半径是20厘米的圆柱形容器里清洗,这时水深30厘米,拿出土豆后,下面下降了3厘米你能求出土豆的体积是多少吗? 将一个底面半径是5cm,高为10cm的圆柱改造成一个直径为20cm的圆柱,体积不变,那高变成?保留π 李叔叔的车的邮箱内约有20升汽油,每升汽油可以行驶6.4km.李叔叔准备开车出外办事,往返路程为195km李叔叔至少还需要加多少千克油? 如何能在没有容积表和液位仪的情况下知道油罐里有多少油?我现在只知道我的油罐是55立方和30立方的,有没有什么办法能大概知道多少而不至于当个睁眼瞎让司机给宰了 加油站的汽油用完了他们怎么补充? 张叔叔准备驾车去240千米远的目的地,现有25升汽油,若每升油可供汽车行驶6.4千米,张叔叔还需要加多少升的汽油才能到达目的地? 把一些土豆放在底面半径是20厘米的圆柱形容器里清洗,土豆全部进入水中后水深30厘米,拿出土豆后,水面下降3厘米,你能求出土豆的体积是多少么? 1、圆柱体:底面直径10CM,高10CM.2、长方体:长10CM,宽5CM,高20CM.1、圆柱体:底面直径10CM,高10CM.2、长方体:长10CM,宽5CM,高20CM. 某种商品的进价为400元,标价是600元,打折销售后的利润率为5%,那么此种商品按几折销售的?给出的答案是:600×0.1x-400=400×5%为什么× 0.1x,0.1x从哪儿来的? 豆豆把一些土豆放在底面半径是20厘米的圆柱形容器里清洗,这时水深30厘米,拿出土豆后,水下降5厘米.问土豆的体积是多少? 汽油是怎么运到加油站的 一个水桶里装满了水,第一次倒出水的一半还多1千克,第二次又倒出余下的水的一半少1千克,这时桶里还剩6千克水.原来桶里有多少千克水? 一些土豆放在地面半径是20厘米的圆柱容器里清洗,土豆全部浸入水中后,水深30厘米,拿出手土豆后水面下降三厘米,求出土豆的体积是多少吗? 甲乙两个商场以同样的价格出售同样的商品,并且又各自推出不同的优惠措施,甲商场的优惠措施是:累计购买100元商品后,再买的商品按原价的90%收费;乙商场则是:累计购买50元商品后,再买 一个长6dm,宽4dm的长方体玻璃鱼缸中成有深3dm的水被水浸泡着的玻璃的面积是多少平方分米算式和得数都写上 计算贮油罐重量已知一个五千方的储油罐,平顶平底,罐体钢板为15毫米,求解整罐重量,最好列岀工式罐是圆柱体 甲乙两个商场以同样的价格出售同样的商品,并且又各自推出不同的优惠措施,甲商场的优惠措施是:累计购买10 一种植物很像莴笋叫什么?可以吃可以做药,温州话叫可暮生,我不知那种植物真正的名称叫什么? 求高手计算油罐的油重量我的油罐是圆形卧式的,两个端面是圆形、也是油罐的高度和直径!油罐内直径是:1.965米,长度是:3.740米,油位在直径里面的高度是0.715米,油的密度是0.84,求油罐里面的 一个长方体的容器,底面长2分米,宽1.放入一个土豆后,水面升高了0.2分米,这个土豆的体积是多少, 莴笋属于什么科 油罐的重量怎么计算现有一个椭圆形的铁油罐,长半径是1.6米,短半径是1.2米,油罐高是3米,铁皮的厚度是0.5厘米,求这个油罐德的重量,(铁的密度是7.85), 一个长方体容器,底面长2分米,宽1.放入一个土豆后水面升高了0.2分米,这个土豆的体积是多少? 一桶水,第一次到出它的1/8,第二次倒出它的1/4,还剩35L,这桶水原来有多少升 1.一件服装的售价是560元,其盈利为40%,求这件衣服的成本价.2.房产商将每套成本为60万元1.一件服装的售价是560元,其盈利为40%,求这件衣服的成本价.2.房产商将每套成本为60万元的住宅以80万 一个长方体容器,底面长2分米,宽1.放入一个土豆后水面升高了0.这个土豆的体积是多少! 把14立方米的水倒入长3dm,宽2dm,高6dm的长方体玻璃缸内,水面距缸口有()dm 聪聪把一些土豆放在底面半径是20cm的圆柱形容器里清洗,土豆全部侵入水中后水深30cm,拿出土豆后,水面下降了3cm.你能求出土豆的体积是多少吗?要讲清楚.为什么要这样做 将15L水和一个土豆一起放入一个长4DM,宽2DM,的玻璃缸中,这是水面离缸口1DM.求出土豆的体积是多 一个长方体容器,底面长2分米,宽1.5分米水深0.8分米放入一个土豆后水面升高0.2分米,土豆体积是多少 zippo打火机灯芯江苏省、南京市.那边有ZIPPO的打火机灯芯卖啊.求知谁能告诉我啊 将15 L水和一个土豆一起放入一个长4宽两分米高三分米的玻璃缸中这时离缸口1dm,你能求出土豆的体积是多少吗? 60kg花生油可榨花生油21kg,照这样计算,24kg花生可榨花生油多少kg?用比例知识解答. 酒精灯芯打火机安全么昨天在夜市 花了30块钱 买了个打火机 (其实我不抽烟 ..只是买着玩) 但我怎么觉得 这个打火机 不安全啊.它不是 灌气的 而是 在后面 滴一些水...中间是根 酒精灯 那 将15升水和一个土豆一起放入一个长四分米,宽二分米,高三分米的玻璃缸中这时水面离缸口1分米求土豆的体积 甲乙两商店以同样价格出售同样的商品,并推出不同的优惠方案在甲、乙两商店以同样价格出售同样的商品,并且又各自推出不同的优惠方案:在甲店累计购买100元商品后,再购买的商品按原价 加油站油罐3吨、5吨、10吨分别的价格是多少? 下面的玻璃缸中原来有500毫升的水,在每个玻璃缸都放入一个土豆,结果如下图.每个土豆的体积是多少立方厘米小学六年级数学补充习题第19页第四小题,谢谢 怎样加盟中国石化开加油站 一件商品进货价是80元,售货价是100元,利润率是多少 应用题:一件服装售价50元,盈利率百分之40,求这件衣服成本价 加油站的93号汽油中是不是已经添加了甲基叔丁基醚?大概添加了多少?据说不能超过15%,我如果继续向里面加甲基叔丁基醚的话,会有什么后果?超过15%会有什么后果? 某种商品的进价为100元,售价为a元,把该商品销售的利润率用式子表示. 一个正方体玻璃容器棱长3dm,向这个容器倒入18L水,再把两个梨放入水中完全侵没,这时水深28cm.这两个梨的体积是多少立方厘米? 一个长方体长1分米宽1分米高2分米倒入高6厘米的水 然后放入一个土豆水上升到8厘米 求土豆的体积快
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn