Android Runtime.getRuntime().exec 命令导致应用程序在获取输出之前冻结

Android Runtime.getRuntime().exec command causes app to freeze before getting an output

我正在尝试构建一个可以 ping 服务器并获得延迟的应用程序。为此

Process process = Runtime.getRuntime().exec(pingCommand);

command 调用 system/bin/ping -c 命令。

因此,当我从 UI 按下计算 (我使用的按钮) 时,它会冻结应用程序,直到 exec 完成。我该如何解决冻结问题,以便它可以让我在获取答案时关闭键盘?

您正在 UI 线程中进行网络请求,因此由于等待响应(并保持连接活动)而冻结

使用任何异步方式处理网络事务,最适合您的方式是 AsyncTask(将您的网络相关方法调用移至 doInBackground 方法,在 onPostExecute 中发布结果)

避免UI在线程运行中冻结

new Thread(new Runnable() {
        public void run() {

            try {
                // Send script into runtime process
                Process process = Runtime.getRuntime().exec(pingCommand);

                // ......

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // .....
            }
        }
    }).start();
}

备选

您可以这样使用 AsyncTask

private class YourTasksClass extends AsyncTask<Void, Void, String> {


    private String cmd;

    public YourTasksClass(String command) {
        this.cmd = command;
    }

    @Override
    protected String doInBackground(Void... voids) {


        try {
            Process process = Runtime.getRuntime().exec(cmd);

            // ....

            String someResult = "some kind of result";

            return someResult;

        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        if(result != null) {
            Log.d("tag", "Result: " + result);
        }

    }
}

稍后在您的代码中,您可以通过以下方式调用它:

new YourTasksClass(pingCommand).execute();