为什么我的Android Runtime进程有时会挂在waitFor()?

时间:2016-01-19 12:10:56

标签: java android process network-programming runtime.exec

我正在使用进程ping我网络上的计算机。 (这是我正在处理的Android应用程序)

public int pingHost(String host) throws IOException, InterruptedException {
    String cmd = "/system/bin/ping -c 1 -W 1000 " + host;
    proc = Runtime.getRuntime().exec(cmd);
    BufferedReader input = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
    String line;
    while ((line = input.readLine()) != null) {
        System.out.println(line);
    }
    proc.waitFor();

    input.close();
    return proc.exitValue();
}

调用此方法,并根据进程提供的exitValue确定ping是否成功。我用我的网络上的大多数主机测试了这个pingHost()方法,我得到一个退出值并用适当的消息进行响应。(ping success / ping失败)。但是在我的网络上有一个特定主机,则不会返回exitValue。为什么会这样?

我发现有人遇到类似的问题,但提供给他们的解决方案对我没有帮助。这个过程仍然悬而未决。没有提供错误。有什么建议吗?

我尝试添加一个在调用waitFor()之前启动的线程...线程会休眠3秒然后销毁该进程,但这并没有帮助。我有没有想到的另一个问题?

显然在Java 8中添加了一个允许超时参数的新waitFor()方法...我的IDE设置为使用jdk1.8.0_65,但这种方法对我来说是不可用的。有什么我忘了做的吗?

1 个答案:

答案 0 :(得分:0)

要回答“ping”网络中的计算机的问题,您可以使用:

InetAddress.getByName(host).isReachable(timeout)

文档:

  

尝试达到此InetAddress。此方法首先尝试使用ICMP(ICMP ECHO REQUEST),然后回退到远程主机的端口7(Echo)上的TCP连接。

此函数将尝试ping主机,并返回正/负结果。好处是,这将处理大多数Linux / Windows /无论是Android设备的“幕后”。即使你没有访问ping二进制文件,或者你的设备中的其他地方,也没有访问二进制文件的路径。