从java(Android)运行外部命令并读取连续输出

从java(Android)运行外部命令并读取连续输出,android,user-interface,android-ndk,native,bufferedreader,Android,User Interface,Android Ndk,Native,Bufferedreader,我想运行excutable,比如ping(或任何其他提供连续输出的)并读取其输出并在GUI中打印 我使用以下方法运行命令: command=Runtime.getRuntime().exec("ping www.google.com"); 我读取的输出如下所示: BufferedReader in = new BufferedReader(new InputStreamReader(command.getInputStream())); while ((line = in.readLine(

我想运行excutable,比如ping(或任何其他提供连续输出的)并读取其输出并在GUI中打印

我使用以下方法运行命令:

command=Runtime.getRuntime().exec("ping www.google.com");
我读取的输出如下所示:

BufferedReader in = new BufferedReader(new InputStreamReader(command.getInputStream()));

while ((line = in.readLine()) != null) {  
                    System.out.println(line+"\n");
}
虽然与我使用adb-DShell执行./excutable时所花费的时间相比,显示输出相当晚,但这很好

由于我希望在gui中显示此输出(行),因此我创建了一个TextView并将输出(行)附加到其中,如下所示:

txtview=(TextView)findViewById(R.id.textview);
while ((line = in.readLine()) != null) {  
                    txtview.append(line+"\n");
                    System.out.println(line+"\n");
}
但这会使我的应用程序崩溃。
请告诉我如何克服这个问题。

如果您的最后一块代码是在
活动中执行的,那么您可能阻塞UI线程的时间太长了。这将导致Android强制关闭您的应用程序。尝试使用
AsyncTask
获取输出并更新您的GUI。

但是,我如何使用AsyncTask读取BufferedReader并在TextView中显示每一行(当它们在BufferedReader中出现时)?您在doInBackground期间读取文本。您可以将每一行传递给onProgressUpdate并在那里更新UI,也可以更新类成员变量。底线是,你必须在背景线程上阅读!当onProgressUpdate以整数作为参数时,我如何将字符串传递给它?此外,我不能使用findViewById(),因此,我如何查找TextView并向其追加数据?您可以定义onProgressUpdate在创建实现时采用的类型,因为它是泛型。JavaDoc中的示例只显示整数,但它可以是任何东西。AsyncTask应声明为活动的内部类,以便可以使用findViewById。