2011-04-15 9 views
5

Cuando intento exec un script externo de esta manera:Runtime.exec() en Android cuelga

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 veces, el script se ejecuta, pero más a menudo mi aplicación cuelga un par de segundos hasta que dice mi Android la aplicación no responde y debe eliminarla.

Mi pregunta es, ¿qué puede estar pasando? La secuencia de comandos es que se ejecuta a veces, y hay sin excepción que se lanza, simplemente se bloquea. No sé qué está pasando. Estoy usando Froyo (2.2.1 creo).

Gracias!

+1

Hmm creo que algo que ver con rosca androide. Has intentado hacer esto en un hilo. – Josnidhin

+0

¿Crees? Tal vez, hay algún tipo de punto muerto sucediendo, no sé. Tienes razón, le daré su propio hilo. :-) –

+0

Consulte la clase de proceso doc developer.android.com/reference/java/lang/Process.html. La descripción general parece útil y explica por qué podría estar bloqueando. – Josnidhin

Respuesta

3

De acuerdo con la documentación, debe leer el error y salir del proceso.

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

creo que algo como lo siguiente va a resolver su 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(); 
     } 
    } 
} 

utilizar la clase anterior en el código como éste

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

¡Gracias, lo intentaré! –

+1

No funcionó por desgracia. :-/ ¡Gracias de cualquier manera! –

+0

qué pasó .. – Josnidhin