2011-04-15 69 views
5

当我尝试给exec这样一个外部脚本:的Runtime.exec()在Android中挂起

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的说我应用程序没有反应,它需要杀死它。

我的问题是,可能发生了什么。脚本有时候运行的是,并且有没有异常被抛出,它只是挂起。至于发生了什么,我感到不知所措。我正在使用Froyo(2.2.1我认为)。

谢谢!

+1

嗯,我猜是与Android的线程。你有没有试过在一个线程中这样做。 – Josnidhin 2011-04-15 06:10:38

+0

你是这么认为的吗?也许,会发生某种僵局,不知道。你是对的,我会给它自己的线索。 :-) – 2011-04-15 06:24:49

+0

查看进程类doc developer.android.com/reference/java/lang/Process.html。概述看起来很有用,并解释了为什么它可能会被阻止。 – Josnidhin 2011-04-15 07:51:26

回答

3

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

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(); 
} 
+0

谢谢,我会试试! – 2011-04-15 09:07:24

+1

不幸的是没有工作。 :-/ 不管怎么说,还是要谢谢你! – 2011-04-15 13:17:11

+0

发生了什么事.. – Josnidhin 2011-04-15 14:03:56