- 浏览: 528565 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
c7887qin:
貌似还要使用相同的证书进行签名。。。
Android - 如何将两个/多个应用放到一个进程中去? -
北极光之吻:
天天向上1989 写道不是有OnDoubleTapListen ...
android实现双击事件监听 -
nielong123:
nielong123 写道onCheckedChanged(M ...
Android RadioGroup 换行, 支持多行多列 -
nielong123:
onCheckedChanged(MultiRadioGrou ...
Android RadioGroup 换行, 支持多行多列 -
zk_Ming:
zk_Ming 写道我用了你的,但是radiogroup 点击 ...
Android RadioGroup 换行, 支持多行多列
今天我们继续就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的框架。
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的框架。
发表评论
-
Android 修改Android签名证书keystore的密码、别名alias以及别名的密码
2015-04-27 10:35 1251转载请注明出处:http://blog.csdn.net/ ... -
基本HTTP请求回顾
2014-12-24 11:40 932HttpURLConnection为javaAPI提供的一种R ... -
Android签名验证简介
2014-05-16 10:15 5388Android原生自带了个安装器(packages\apps ... -
adb server is out of date. killing...
2014-04-17 10:28 10411:今天调试android的时候发现一个诡异的问题 [htm ... -
Android关闭其他程序
2014-03-21 16:24 15971. restartPackage方法 这个方法在an ... -
正则表达式大全
2014-03-18 17:05 1019正则表达式匹配网址: (https://[\w]*.|http ... -
正则表达式大全
2014-03-18 16:53 0正则表达式匹配网址: (https://[\w]*.|http ... -
jni jstring 、char* 类型的转换
2014-03-06 18:20 850jni jstring 、char* 类型的转换 //jst ... -
ListView GridView禁止点击效果
2014-01-12 01:36 5391listView里的item在点击的时候会变成黄色高亮显示,这 ... -
基于 Android NDK 的学习之旅-----资源释放
2014-01-11 14:37 1138转载于http://www.cnblogs.com ... -
Android RadioGroup 换行, 支持多行多列
2013-11-06 16:06 36943经过反复试验,发现无论你怎么摆弄RadioGroup, ... -
Android RadioGroup 换行, 支持多行多列
2013-11-06 16:05 0经过反复试验,发现无论你怎么摆弄RadioGroup, ... -
Android Gallery子元素无法横向填满屏幕的问题解决
2013-07-26 17:50 1465问题解决方法:你只需要把你的子元素的最外层布局用相对 ... -
Android系统手机端抓包方法
2013-06-25 11:42 1019抓包准备 1. Android手机需要先获得root权限。 ... -
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{
2013-05-29 15:01 1295出现这个问题时,第一步看看manifest.xml是否配置正确 ... -
Android捕获异常
2013-04-03 14:52 1072如果有些异常是运行时异常,你无法捕获,但是又不想让程序 ... -
root卸载系统程序
2013-02-20 10:31 1748大家知道,卸载程序分为两种。一种是普通的应用程序,一种 ... -
JAVA比较器报错:Comparison method violates its general contract
2013-02-05 13:03 13861java.lang.IllegalArgumentExcept ... -
java.lang.IllegalStateException: tried to write 1544 bytes with content-length
2013-01-31 14:57 1424上传文件时,content-length定义的长度小于 ... -
Javadoc生成方法
2013-01-23 14:30 1068方法1:在eclipse中生成 ...
相关推荐
### Android开发进阶之NIO非阻塞包 #### NIO非阻塞通讯方式解析 在探讨Android DDMS源码中的NIO(Non-blocking I/O)非阻塞通讯方式时,我们首先需要理解NIO的基本概念及其在Android开发中的应用。 **NIO简介**:...
### Android开发进阶之NIO非阻塞包 #### 关键知识点概述 1. **NIO(New I/O)的概念**:NIO是Java 1.4版本开始引入的新I/O处理模型,它通过非阻塞的方式提高了I/O操作的性能。在Android开发中,利用NIO可以显著...
总的来说,Android开发中的NIO技术提供了高性能、非阻塞的网络通信解决方案,有效地解决了多线程管理和资源消耗的问题。它不仅简化了并发编程,也提升了Android应用程序在网络通信方面的效率。对于Android开发者来说...
8. **Java NIO**:非阻塞I/O操作在Java中的实现与应用。 9. **Java Web基础**:涵盖前端脚本语言、框架等基础知识。 10. **JavaScript DOM视频**:了解网页元素的操作与控制。 11. **jQuery视频**:简化HTML文档遍历...
Java的IO系统分为传统IO和NIO(非阻塞IO)。RandomAccessFile允许随机访问文件,而NIO引入了通道和缓冲区,提高了数据传输效率。异常处理是程序健壮性的关键,Java的异常分为检查异常和运行时异常,理解异常的层次...
I/O流处理和NIO(非阻塞I/O)对于读写文件和网络通信至关重要。线程与并发编程是Java的强项,涉及线程同步、死锁避免、并发工具类(如Semaphore、CountDownLatch)等内容。 再者,Java EE(企业版)是Java在服务器...
Java语言是目前世界上最流行的编程语言之一,广泛应用于企业级应用、移动开发(Android)、大数据处理等领域。本资源包含了“Java语言程序设计-基础篇”和“Java语言程序设计-进阶篇”的全部源码,是学习和深入理解...
对于IO流,理解输入输出处理,文件操作,以及NIO(非阻塞I/O)的概念也是必要的。 进一步,深入研究Java的反射机制,它允许我们在运行时动态地获取类的信息并调用其方法。还要学习Java的泛型,它提供了类型安全的...
学习者还需要熟悉集合框架,如ArrayList、LinkedList、HashMap等,以及IO流和NIO(非阻塞I/O)系统,这些用于数据的输入输出和文件操作。 在高级主题中,线程和并发处理是Java的一大亮点,理解如何创建和管理线程,...
- **网络I/O**:阻塞I/O、非阻塞I/O、NIO(New I/O)等。 - **JVM内存管理**: - **堆和栈**:理解它们的区别及其在程序中的作用。 - **垃圾回收**:GC算法、堆内存分区(如Young区、Old区)等。 - **性能调优*...
- **IO流与NIO**:文件操作,网络通信,以及非阻塞I/O模型。 - **多线程**:线程同步、死锁避免以及并发工具类的使用。 - **集合框架**:ArrayList、LinkedList、HashMap等数据结构的使用和实现原理。 - **反射...
- **Java非阻塞IO(NIO)**:教授Java NIO的基础和高级用法,这对于处理高并发场景非常关键。 3. **JavaWeb阶段** - **JavaScript DOM编程视频教程**:JavaScript是前端开发的核心语言之一,DOM编程是其中的重要...
7. **IO与NIO**:包括旧的I/O模型和新的非阻塞I/O模型,有助于优化读写操作。 8. **Java Swing和JavaFX**:介绍图形用户界面的构建,用于开发桌面应用。 9. **JDBC**:讲解如何连接数据库,执行SQL语句,处理结果...
3. NIO(New Input/Output):提供非阻塞I/O,适用于高性能网络通信,如SocketChannel、Selector和Buffer。 六、网络编程 1. Socket编程:通过ServerSocket和Socket实现客户端-服务器通信,理解TCP和UDP协议的区别...
- **NIO.2**:增加了文件系统操作的API,增强了非阻塞I/O能力。 - **Scripting API**:允许在Java应用程序中嵌入和使用脚本语言,如JavaScript。 - **Java Database Connectivity (JDBC) 4.0**:改进了数据库连接...
接下来,课程会介绍Java的IO流和NIO(非阻塞I/O)系统,这对于处理数据输入和输出至关重要。此外,线程和并发编程也是Java的一大特色,这部分内容会涵盖线程的创建、同步和通信,帮助学习者理解如何在多核处理器环境...
3. **I/O流**:`java.io`包提供了丰富的流处理类,通过源码我们可以学习如何进行数据的读写,了解缓冲流、字符流与字节流的区别,以及NIO(非阻塞I/O)的实现。 4. **集合框架**:Java集合框架是数据结构和算法的...
8. **I/O与NIO**:Java I/O流用于读写文件和网络通信,而NIO(New IO)提供了一种非阻塞的I/O模型,提高了效率。 9. **Java Swing与JavaFX**:这些是Java的图形用户界面(GUI)工具包,用于创建桌面应用。 10. **...