首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Runtime.exec() bug:挂起

Runtime.exec() bug:挂起
EN

Stack Overflow用户
提问于 2012-07-09 08:06:12
回答 2查看 1.7K关注 0票数 2

我的应用程序做的第一件事就是检查"su“,因为这是应用程序工作所必需的。即使有时它可以工作,通常是在终端中输入"killall packageName“之后。我做了一个简单的测试应用程序,但我不能每次都让它工作。发生这种情况的代码:

代码语言:javascript
复制
String[] args = new String[] { "su" };
Log.v(TAG, "run(" + Arrays.toString(args) + ")");
FutureTask<Process> task = new FutureTask<Process>(new Callable<Process>() {
    @Override
    public Process call() throws Exception {
        return Runtime.getRuntime().exec(args);
    }
});
try {
    Executors.newSingleThreadExecutor().execute(task);
    return task.get(10, TimeUnit.SECONDS);
} catch (Throwable t) {
    task.cancel(true);
    throw new IOException("failed to start process within 10 seconds", t);
}

完整项目:testexec

由于这个应用程序一开始只运行exec(),我无法关闭以前打开的任何文件描述符,就像在另一个堆栈溢出问题:https://stackoverflow.com/a/11317150/1145705中提到的那样

PS:我在不同的设备上运行Android4.0.3/ 4.0.4。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-10 19:38:43

3c71关于开放的文件描述符是正确的。在我的例子中,是AdMob SDK引起了问题,因为在我试图调用exec(.)的时候,它有时会(重新)从网络上加载广告。让我陷入僵局。

我的解决方案是一次分叉一个"su“进程,并将它重用到所有命令中,并在分叉该进程之后加载广告。

票数 2
EN

Stack Overflow用户

发布于 2012-07-09 08:23:51

要安全地使用Runtime.exec,您应该等待进程完成并使用输出流和错误流,最好是并发(以防止阻塞):http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11391177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档