2011-04-15 65 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