Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将进程的标准输出绑定到TextView_Android_Process_Textview_Inputstream - Fatal编程技术网

Android 如何将进程的标准输出绑定到TextView

Android 如何将进程的标准输出绑定到TextView,android,process,textview,inputstream,Android,Process,Textview,Inputstream,我正在开发我的第一个Android应用程序。我需要以root用户身份在shell中执行命令,因此我在我的应用程序中引入了以下代码: process = Runtime.getRuntime().exec("su"); 然后,我获得一个流程的输出流,并使用它执行命令: os = new DataOutputStream(process.getOutputStream()); os.writeBytes("tcpdump\n"); 然后我获得一个输入流,我想用它来显示过程的结果: is = n

我正在开发我的第一个Android应用程序。我需要以root用户身份在shell中执行命令,因此我在我的应用程序中引入了以下代码:

process = Runtime.getRuntime().exec("su");
然后,我获得一个流程的输出流,并使用它执行命令:

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

os.writeBytes("tcpdump\n");
然后我获得一个输入流,我想用它来显示过程的结果:

is = new DataInputStream(process.getInputStream());
我希望将获得的DataInputStream绑定到布局中的TextView,以便在进程继续显示结果时实时更新它显示的文本

我一直在搜索android的java.ioAPI,但我找不到一个简单的方法。我一直在考虑用一个循环运行一个线程,该循环不断地检查输入流中是否有新数据,然后将其复制到TextView,但这似乎是一个糟糕的解决方案


如果有人知道这样做的方法,我将非常感谢。

将TextView.append方法与Handler结合起来

下面是一个很好的例子:


我已经能够设置一个处理程序并启动一个runnable,它将每隔200毫秒从输入流中读取一次

尽管如此,输入流似乎没有从流程标准输出接收任何字符,每次我调用read()方法时,它都会被阻塞,等待永远不会出现的字符。我一直在尝试遵循这两个网站的说明,但都没有成功:


谢谢。

经过一天的研究和测试,我发现解决这个问题的唯一方法是使用AsyncTask。
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);
您可以调整此代码,该代码工作正常:
如果您喜欢,它还可以将ProcessBuilder()替换为Runtime.getRuntime()。

什么是会话?