我已经阅读了很多这个论坛,它帮助我设置我的应用程序,但是,我现在有另一个问题,我想要做的是在textview中显示“top”命令输出。 所以布局基本上是两个按钮(开始和停止)和一个textView,我在这里读到我必须使用异步任务来运行命令,这里很好,现在的问题是如何解析输出以便正确显示? 我想要的结果是显示top命令结果的小textview(与在终端中运行命令相同的输出)
public class Async extends AsyncTask<String, String, Void>
{
private View rootView;
private Activity rootAct;
public Async(View view,Activity act) {
// TODO Auto-generated constructor stub\
View rootView = view;
rootAct = act;
}
@Override
protected void onPreExecute() {
Log.d("PRE-EXECUTE", "OK");
}
@Override
protected void onCancelled() {
Log.d("ON CANCEL", "OK");
}
@Override
protected Void doInBackground(String... params) {
//Execution en BackGround
Log.d("BACKGROUND", "START");
Log.d("BACK PARAM 0", params[0]);
Log.d("BACK PARAM 1", params[1]);
try {
// Executes the command.
Process process = Runtime.getRuntime().exec("top");
// Reads stdout.
// NOTE: You can write to stdin of the command using
// process.getOutputStream().
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
int read;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((read = reader.read(buffer)) > 0) {
output.append(buffer, 0, read);
publishProgress(output.toString());
}
reader.close();
return null;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void onProgressUpdate(String... values) {
Log.d("UPDATE", "START");
Log.d("RESUL", values[0]);
TextView sortie = (TextView) rootAct.findViewById(R.id.txt_output);
sortie.setText(values[0]);
Log.d("UPDATE", "STOP");
}
@Override
protected void onPostExecute(Void result) {
Log.d("POSTEXE", "OK");
}
}
因此,我想要的是我的textView显示最高命令结果并在每次新的“开始”行存在时更新,不确定它是否非常清楚,实际上更简单的例子是打开你的终端命令手机类型顶部,我想要完全相同的输出......
我希望有人能帮助我完成这个项目! (对不起我可怕的英语,我是法国人:))
最诚挚的问候,
编辑:事实上,我只需要一种方法来读取缓冲区并将行附加到我的输出中,除非连续有3个“\ n”,是否可以?
答案 0 :(得分:1)
嗯,事实上,经过几个小时,我找到的唯一方法是解析它&#34;旧学校&#34;即使结果不完美......
while ((line = reader.readLine()) != null) {
if (isCancelled()) {
break;
}
if (line.isEmpty() && i == 2) {
Log.d("BACK", "Retour apres 3 espaces");
publishProgress(output.toString());
output.setLength(0);
i = 0;
} else if (line.isEmpty() && i == 1) {
Log.d("BACK", "2 espaces");
output.append("\n \n");
i = 2;
} else if (line.isEmpty() && i == 0) {
Log.d("BACK", "1 espaces");
output.append("\n \n");
i = 1;
} else {
Log.d("BACK", "LigneTxt");
output.append(line + "\n");
i = 0;
}
这似乎可以完成这项工作,但是数据的流动并不是真正流畅的,因此,如果有人有想法,它是不是很完美,我对任何评论持开放态度?