com.android.ddmlib.TimeoutException
at com.android.ddmlib.AdbHelper.read(AdbHelper.java:686)
at com.android.ddmlib.AdbHelper.read(AdbHelper.java:654)
at com.android.ddmlib.AdbHelper.readAdbResponse(AdbHelper.java:217)
at com.android.ddmlib.AdbHelper.setDevice(AdbHelper.java:772)
at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:396)
at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:347)
at com.android.ddmlib.Device.executeShellCommand(Device.java:435)
at com.sprd.device.DeviceManager.getMemUsage(DeviceManager.java:213)
at com.sprd.main.ListTablePanel$Monitor.doInBackground(ListTablePanel.java:668)
at com.sprd.main.ListTablePanel$Monitor.doInBackground(ListTablePanel.java:1)
at javax.swing.SwingWorker$1.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javax.swing.SwingWorker.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
在做功能遍历的时候遇到这种问题,是因为你执行的命令需要返回结果。那么socket等待结果的过程中会有时间限制,超过时间限制就会报错。
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);
int numWaits = 0;
while (buf.position() != buf.limit())
{
int count = chan.read(buf);
if (count < 0) {
Log.d("ddms", "read: channel EOF");
throw new IOException("EOF");
}if (count == 0)
{
if ((timeout != 0) && (numWaits * 5 > timeout)) {
Log.d("ddms", "read: timeout");
throw new TimeoutException();
}
try
{
Thread.sleep(5L);
} catch (InterruptedException ie) {
}
numWaits++;
} else {
numWaits = 0;
}
}
}
timeout的值为5000毫秒,也就是5秒钟。但是在read方法中不是用时间来计算的,而是通过读取文件,记录没有读到文件的次数,如果连续超过25000次。则会报timeout错误。
暂时没有好的方法解决它,因为对于ddmlib内部的错误,你能把它咋的呢。所以提供一些折中方法:
1.尽量将ddmlib的jar包更新到最新的版本
2.尽量不要使用执行命令然后等待获取返回值的命令。如果确实需要就用Java.Runtime.exec来执行吧,然后读取获得的结果,至少咱还能控制一下。