【问题标题】:Runtime.exec() in Android hangsAndroid 中的 Runtime.exec() 挂起
【发布时间】:2011-04-15 05:54:35
【问题描述】:

当我尝试以这种方式执行外部脚本时:

try {
    process = Runtime.getRuntime().exec(
        new String[] { "/system/bin/sh", "./myscript.sh" },
        null,
        "/data/mydir",
    );
} catch (IOException e) {
    Log.e(TAG, e.getMessage(), e);
} catch (SecurityException e) {
    Log.e(TAG, e.getMessage(), e);
}

有时脚本会被执行,但大多数情况下我的应用会挂起几秒钟,直到 Android 说我的应用没有响应并且需要终止它。

我的问题是,可能会发生什么。脚本 is 有时会运行,并且 no 异常被抛出,它只是挂起。我不知道发生了什么。我正在使用 Froyo(我认为是 2.2.1)。

谢谢!

【问题讨论】:

  • 嗯,我想这与 android 线程有关。您是否尝试过在线程中执行此操作。
  • 你这么认为吗?也许,发生了某种僵局,不知道。你是对的,我会给它自己的线程。 :-)
  • 查看流程类文档 developer.android.com/reference/java/lang/Process.html。概述似乎很有用,并解释了它可能会阻塞的原因。

标签: android runtime exec android-2.2-froyo


【解决方案1】:

根据文档,您应该阅读该过程的错误和输出流。

http://developer.android.com/reference/java/lang/Process.html

我认为以下内容可以解决您的问题。

class Reader extends Thread
{
    InputStream is;

    Reader(InputStream is){
        this.is = is;
    }

    public void run()
    {
        try
        {
            InputStreamReader inStreamReader = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(inStreamReader);
            String line=null;
            while ( (line = br.readLine()) != null){
                // log here   
            }
        } catch (IOException ex){
            ex.printStackTrace();  
        }
    }
}

像这样在你的代码中使用上面的类

try {
    process = Runtime.getRuntime().exec(
        new String[] { "/system/bin/sh", "./myscript.sh" },
        null,
        "/data/mydir",
    );
    Reader err = new Reader(process.getErrorStream());
    Reader output = new Reader(process.getInputStream());

    err.start();
    outout.start();

} catch (IOException e) {
    Log.e(TAG, e.getMessage(), e);
} catch (SecurityException e) {
    Log.e(TAG, e.getMessage(), e);
} finally {
    process.destroy();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多