Как привязать стандартный вывод процесса к TextView - PullRequest
3 голосов
/ 21 февраля 2011

Я разрабатываю свое первое приложение для Android. Мне нужно выполнить команду в оболочке от имени пользователя root, поэтому я ввел этот код в свое приложение:

process = Runtime.getRuntime().exec("su");

Затем я получаю поток вывода для процесса и использую его для выполнения команды:

os = new DataOutputStream(process.getOutputStream());

os.writeBytes("tcpdump\n");

Затем я получаю входной поток, который я хочу использовать для отображения результатов процесса:

is = new DataInputStream(process.getInputStream());

Я хотел бы привязать полученный DataInputStream к TextView в макете, чтобы отображаемый текст обновлялся в реальном времени по мере продолжения процесса, показывая результаты.

Я искал в API java.io для Android, и я не могу найти простой способ сделать это. Я думал о том, чтобы запустить поток с циклом, который постоянно проверяет, есть ли новые данные во входном потоке, а затем копирует их в TextView, но это кажется дурацким решением.

Буду признателен, если кто-нибудь знает способ сделать это.

Ответы [ 4 ]

3 голосов
/ 13 декабря 2012
Channel channel = session.openChannel("shell");

OutputStream os = new OutputStream() {

    @Override
    public void write(int oneByte) throws IOException {
        TextView textView1 = (TextView) findViewById(R.id.textView1);
        char ch = new Character((char) oneByte);
        textView1.setText(textView1.getText() + String.valueOf(ch));
        System.out.write(oneByte);
    }
};

// channel.setOutputStream(System.out);
channel.setOutputStream(os, true);
1 голос
/ 21 февраля 2011

Мне удалось установить обработчик и запустить исполняемый файл, который будет читать из входного потока каждые 200 мс.

Несмотря на это, кажется, что входной поток не получает никаких символов из процессастандартный вывод и каждый раз, когда я вызываю метод read (), он блокируется в ожидании символов, которые никогда не появляются.Я безуспешно пытался следовать инструкциям на этих двух веб-сайтах:

http://gimite.net/en/index.php?Run%20native%20executable%20in%20Android%20App

http://code.google.com/p/market-enabler/wiki/ShellCommands

Спасибо.

1 голос
/ 21 февраля 2011

Объединение метода TextView.append с обработчиком

Вот хороший пример:

http://android -developers.blogspot.com / 2007/11 / стежок-в-time.html

0 голосов
/ 17 февраля 2013

После одного дня исследований и испытаний я обнаружил, что единственным решением этой проблемы является использование AsyncTask.Вы можете адаптировать этот код, который работает нормально: https://stackoverflow.com/a/9063257 Он также работает, заменяя ProcessBuilder () на Runtime.getRuntime (), если вам это нравится.

...