Получение результата выполненной команды оболочки не выполняется / зависает - PullRequest
0 голосов
/ 15 сентября 2010

Я пытаюсь выполнить команды оболочки, это работает как надо. Даже результат возвращается (как это видно на LogCat). Проблема заключается в последней строке результата. Каждый раз, когда происходит чтение readLine () в последней строке (что не должно происходить, temp должно быть нулевым), приложение зависает навсегда и не возвращается из вызова readLine. Может быть, вы найдете ошибку. Я пробовал readUTF и standart read (), все та же проблема. И да, приложение получило su-права.

try
                {
                    Process process = Runtime.getRuntime().exec("su");
                    DataOutputStream os = new DataOutputStream(process.getOutputStream());
                    DataInputStream osRes = new DataInputStream(process.getInputStream());
                    for (String single : commands) {
                       os.writeBytes(single + "\n");
                       os.flush();
                       String temp = new String();
                       while(  (temp = osRes.readLine()) != null)
                       {                                      
                           Log.v("NITRO", temp);
                           result2 += temp + "\n";                            
                       }                      
                    }
                    os.writeBytes("exit\n");
                    os.flush();
                    process.waitFor();
                } catch (IOException e)
                {
                    Toast.makeText(Main.this, "Error", Toast.LENGTH_LONG);
                } catch (InterruptedException e)
                {
                    Toast.makeText(Main.this, "Error", Toast.LENGTH_LONG);
                }

Это StackTrace, где он зависает, когда я останавливаю отладчик при зависании:

OSFileSystem.readImpl(int, byte[], int, int) line: not available [native method]    
OSFileSystem.read(int, byte[], int, int) line: 118  
ProcessManager$ProcessInputStream(FileInputStream).read(byte[], int, int) line: 312 
ProcessManager$ProcessInputStream(FileInputStream).read() line: 250 
DataInputStream.readLine() line: 309    
Main$2$1.run() line: 84 
ViewRoot(Handler).handleCallback(Message) line: 587 
ViewRoot(Handler).dispatchMessage(Message) line: 92 
Looper.loop() line: 123 
ActivityThread.main(String[]) line: 4627    
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
Method.invoke(Object, Object...) line: 521  
ZygoteInit$MethodAndArgsCaller.run() line: 868  
ZygoteInit.main(String[]) line: 626 
NativeStart.main(String[]) line: not available [native method]  

1 Ответ

0 голосов
/ 17 сентября 2010

Попробуйте переместить выход до цикла while ... Ваше приложение никогда не завершится, поэтому цикл while никогда не завершится .... Перемещение exit должно привести к завершению приложения, что должно вызвать цикл получить null ...

...