Android 如何将进程的标准输出绑定到TextView
我正在开发我的第一个Android应用程序。我需要以root用户身份在shell中执行命令,因此我在我的应用程序中引入了以下代码: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
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()。什么是会话?