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





更多相关文章

  1. Keyguard之LockPatternView学习
  2. 编译android源码前的准备
  3. Android(安卓)Camera CTS related
  4. android、webService 天气预报demo
  5. Android.Bundle savedInstanceState 的意义用法
  6. Android布局 屏幕滚动方法 ScrollView
  7. EditText获取焦点的一系列方法
  8. android启动蓝牙的过程 (高通方案)
  9. android开发笔记之viewpager 基本使用方法

随机推荐

  1. Android(安卓)Material Design 之 Coordi
  2. Android下滑条ScrollView
  3. Android之Fragment界面布局实例
  4. 【Android(安卓)Studio】Resource Mergin
  5. android的Drawable
  6. ch08 Android(安卓)Intent
  7. android HttpClient 上传图片
  8. Porting WiFi drivers to Android
  9. android 中buildToolsVersion和dependenc
  10. 关于android contentprovider 多线程读取