Я не лучший программист, на самом деле, я довольно плохо :( Мне нужна помощь с чем-то, что сводит меня с ума. В основном у меня есть процесс tcpdump, я хочу извлечь вывод и поместить его в текстовое представление, которое обновляется каждые несколько миллисекунд, я пробовал все и просто не могу заставить его работать.Как связать вывод процесса с текстовым просмотром и автоматически обновлять его в реальном времени?
У меня нет ошибок и, похоже, работает в фоновом режиме, но отображается только куски текста только после того, как я перехожу к рабочий стол и возврат обратно в приложение, однако он не постоянно обновляет текстовое представление, а иногда зависает и падает.
Я создал простой обработчик, который может без проблем обновлять текстовое изображение простым текстом, но затем я столкнулся основные проблемы g чтобы прочесть этот процесс.
кнопку Begin
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.capture);
this.LiveTraffic = (TextView) findViewById(R.id.LiveTraffic);
this.CaptureText = (TextView) findViewById(R.id.CaptureText);
((TextView) findViewById(R.id.ipv4)).setText(getLocalIpv4Address());
((TextView) findViewById(R.id.ipv6)).setText(getLocalIpv6Address());
//Begin button
final Button startButton = (Button) findViewById(R.id.start);
startButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "Now Capturing Packets", Toast.LENGTH_LONG).show();
try {
process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
os.writeBytes("/data/local/tcpdump -q\n");
os.flush();
os.writeBytes("exit\n");
os.flush();
os.close();
inputStream = new DataInputStream(process.getInputStream());
Thread.sleep(1000);
Process process2 = Runtime.getRuntime().exec("ps tcpdump");
DataInputStream in = new DataInputStream(process2.getInputStream());
String temp = in.readLine();
temp = in.readLine();
temp = temp.replaceAll("^root *([0-9]*).*", "$1");
pid = Integer.parseInt(temp);
Log.e("MyTemp", "" + pid);
process2.destroy();
CaptureActivity.this.thisActivity.CaptureText.setText("Active");
} catch (Exception e) {
}
ListenThread thread = new ListenThread(new BufferedReader(new InputStreamReader(inputStream)));
thread.start();
}
});
}
класс ListenThread
public class ListenThread extends Thread {
public ListenThread(BufferedReader reader) {
this.reader = reader;
}
private BufferedReader reader = null;
@Override
public void run() {
reader = new BufferedReader(new InputStreamReader(inputStream));
while (true) {
try {
CaptureActivity.this.thisActivity.CaptureText.setText("exec");
int a = 1;
String received = reader.readLine();
while (a == 1) {
CaptureActivity.this.thisActivity.LiveTraffic.append(received);
CaptureActivity.this.thisActivity.LiveTraffic.append("\n");
received = reader.readLine();
CaptureActivity.this.thisActivity.CaptureText.setText("in loop");
}
CaptureActivity.this.thisActivity.CaptureText.setText("out loop");
} catch (Exception e) {
Log.e("FSE", "", e);
}
}
}
}
«Я пробовал все и просто не могу заставить его работать»: вам нужно быть более конкретным о том, что не работает. Вы получили сообщение об ошибке? Который из? Это не так, как ожидалось? и т. д. – assylias
никаких ошибок, похоже, работает в фоновом режиме, но отображает только фрагменты текста только после того, как я перехожу на рабочий стол и возвращаюсь обратно в приложение. однако он не постоянно обновляет текст, а иногда зависает и падает. – user1488049
Я создал простой обработчик, который может без проблем обновлять текстовое представление простым текстом, но затем я столкнулся с серьезными проблемами, которые заставили его прочитать процесс :( – user1488049