我正在用java编写一个程序,它可以启动应用程序,例如firefox。
编辑:这个程序适用于linux,特别是ubuntu。
启动程序很容易:
Runtime.getRuntime().exec("/usr/bin/firefox");
但是,我希望在窗口完全打开或运行后从窗口中检索详细信息。
目前我正打电话:
Thread.sleep(delay);
要确保窗口准备就绪,但这是一个糟糕的解决方案。需要不同延迟的不同窗口是一个问题。
凌乱。
所以我的问题是,当firefox(或任何其他外部应用程序)完全设置时,有什么方法可以通知我吗?我不认为我可以使用Process.waitFor(),因为在关闭firefox之前,Process不会完成。
提前致谢!
更新:Process.waitFor()不起作用。我已经尝试了它,它只在firefox关闭时返回,而不是在完全设置时返回。只是对于任何自己尝试的人来说,如果另一个firefox窗口已经打开它会起作用(一开始就欺骗了我)但是如果没有现有的窗口它就不会!
答案 0 :(得分:1)
您可以使用Process#waitFor
等待命令执行,然后像这样检查exitValue
:
Process p = Runtime.getRuntime().exec("/usr/bin/firefox");
p.waitFor();
if(p.exitValue()==0) {
//success
} else {
// fail read error stream or out stream for possible causes
}
答案 1 :(得分:0)
好的,我一直在做更多的思考,我有一个相当令人满意的答案。
不要等到窗口准备就绪,而是用xdotool继续搜索它:
while(line == null){
writer.write("xdotool search --onlyvisible --name " + name + "\n");
writer.flush();
if(reader.ready())
line = reader.readLine();
Thread.sleep(1000);
}
xdotool只会在找到名为name的窗口时打印字符串。
因此,如果读者已准备就绪(),那么您就知道窗口已打开。
Thread.sleep()是必要的,因为如果它不存在,xdotool会吐出错误的窗口错误,读者会读到它。
然而,使用像我上面谈到的标准延迟似乎更快,但是这个解决方案甚至可以用于需要更长时间加载的窗口,而不是试图猜测延迟。