2011-04-15 8 views
5

Quando provo ad exec uno script esterno in questo modo:Runtime.exec() in Android pende

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); 
} 

A volte lo script viene eseguito, ma il più delle volte la mia app è appeso un paio di secondi fino a quando dice il mio Android l'app non risponde e deve ucciderlo.

La mia domanda è, cosa può succedere. Lo script è in esecuzione a volte, e c'è no eccezione generata, si blocca. Sono in perdita per quello che sta succedendo. Sto usando Froyo (penso a 2.2.1).

Grazie!

+1

Hmm Credo che qualcosa a che fare con filettatura Android. Hai provato a farlo in una discussione. – Josnidhin

+0

La pensi così? Forse, sta succedendo una specie di stallo, non so. Hai ragione, darò il suo filo. :-) –

+0

Controlla la classe di processo doc developer.android.com/reference/java/lang/Process.html. La panoramica sembra utile e spiega perché potrebbe bloccarsi. – Josnidhin

risposta

3

In base alla documentazione, è necessario leggere il flusso errato ed errato del processo.

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

penso che qualcosa di simile al seguente comando risolverà il vostro problema.

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

utilizzare la classe di cui sopra nel codice come questo

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

Grazie, ci proverò! –

+1

Purtroppo non ha funzionato. :-/ Grazie comunque! –

+0

cosa è successo .. – Josnidhin