#android #runtime #exec #android-2.2-froyo
#Android #время выполнения #exec #android-2.2-froyo
Вопрос:
Когда я пытаюсь выполнить внешний скрипт таким образом:
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. Вы пробовали делать это в потоке a.
2. Вы так думаете? Может быть, происходит какая-то взаимоблокировка, не знаю. Вы правы, я создам для этого отдельный поток. 🙂
3. Ознакомьтесь с документом о классе процесса developer.android.com/reference/java/lang/Process.html . Обзор кажется полезным и объясняет, почему он может блокировать.
Ответ №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();
}