Adb连接超时错误

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来执行吧,然后读取获得的结果,至少咱还能控制一下。





评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值