編輯:高級開發
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平台的主要發展的有一大成員,這對於諾基亞的SymBian和微軟的mobile帶來了不少的壓力
隨著時代的進步科技的發展Dalvik虛擬機的版本也快速的提升與升級,下面我就對升級前和升級後的Dalvik虛擬機系統 ,做一下自己的解析android作為新一代的基於L
隨著移動設備越來越普及,移動設備的功能越來越完善,移動設備的系統平台也日漸火熱起來。目前國內最常見的移動開發平台有塞班,iPhone,Windows phone以及當下
事件是一種有用來收集用戶與應用程序互動數據的互動組件,如按鍵或觸摸屏等放置事件,因為每個事件從Android框架維護事件隊列先入先出(FIFO)基礎上的隊列。可以在程序中