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

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的框架。

在DELPHI 文 本 和 图 形 的 打 印 在Delphi中运用QuickReport实现多栏列印 在打印或打印预览前如何获取报表页数-Delphi资料 自定义快速报表的打印预览窗口-Delphi资料 Delphi 3 图形VCL中Bug修改方案 jsp能不能实现动态include文件??? 谁有JbuilderX的下载地址:) jsp如何连接Access word中使用公式问题 请问怎样可以取到客户端机器的IP地址? VB 菜鸟求教,如何删除ASCII文件中所有的段落标记? 为何在98中能看到NTFS格化的磁盘 有关排序的问题 数据表的备份和恢复。求救。。。 有哪些好看又有意义的电影 谁能解释下面几个词的意思:CPU频率:1024MH 有哪些有意义的电影? 如何区分光盘是不是可擦写的? 语文;摘抄优美语段加感悟最少100字 语文摘抄优美句子加选自和感悟不要是名言名句,而且最 语文的摘抄加感悟,摘抄50字,感悟50字,希望篇数 语文句子摘抄,最好是初中的,加感悟和选自百度里有过 语文摘抄及感悟摘抄100字左右 感悟200字左右~ 法国羊群上街\"游行\" 抗议植入芯南非俩女童惨遭绑架奸杀 年龄仅两三岁德国近三成婴儿生于剖腹产 或与当地经好莱坞大道变性人受攻击案第二名嫌犯落英王室公布四世同堂照 被赞“轻松欢乐到了2020年,我们就能像美国人民一韩国首尔高峰论坛探讨人民币国际化新机马来西亚将对中国团体游旅客暂时免签澳商家欲借电商进入中国市场海军追授梅雄“舍已救人爱民模范”荣誉驭兽神牌极度风流船长阁下新扎太子爷猎艳至尊世纪公园旅游汇龙潭旅游嘉定孔庙旅游法华塔旅游州桥老街旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘