【问题标题】:run external commands from java(Android) and read continuous output从 java(Android) 运行外部命令并读取连续输出
【发布时间】:2011-08-26 21:01:05
【问题描述】:

我想运行可执行文件,例如 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 -d shell 执行 ./excutable 所花费的时间相比,显示输出很晚。

因为我想在 gui 中输出此输出(行),所以我制作了一个 TextView 并将输出(行)附加为:

txtview=(TextView)findViewById(R.id.textview);
while ((line = in.readLine()) != null) {  
                    txtview.append(line+"\n");
                    System.out.println(line+"\n");
}

但这会使我的应用程序崩溃。 请告诉我如何解决这个问题。

【问题讨论】:

    标签: android user-interface android-ndk native bufferedreader


    【解决方案1】:

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

    【讨论】:

    • 但是,我将如何使用 AsyncTask 读取 BufferedReader 并在 TextView 中显示每一行(当它们进入 BufferedReader 时)?
    • 您在 doInBackground 期间阅读了文本。您可以将每一行传递给 onProgressUpdate 并在那里更新 UI,或者您可以更新类成员变量。最重要的是,您必须在后台线程上进行阅读!
    • 当将整数作为参数时,如何将字符串传递给 onProgressUpdate?
    • 此外,我不能使用 findViewById() 那么,我要如何找到 TextView 并将数据附加到它?
    • 您定义 onProgressUpdate 在创建实现时采用的类型,因为它是泛型的。 JavaDoc 中的示例仅显示整数,但它可以是任何值。您的 AsyncTask 应声明为 Activity 的内部类,因此您可以使用 findViewById。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多