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();
我正在尝试构建一个可以 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();