Как остановить текущую команду
int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button start = (Button) findViewById(R.id.start);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
String[] cmd = new String[] { "logcat", "-f",Environment.getExternalStorageDirectory()+"/log.txt", "-v", "time" };
Runtime.getRuntime().exec(cmd);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
thread.start();
}
});
Button stop = (Button) findViewById(R.id.stop);
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Runtime.getRuntime().exec("logcat -d");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Button addLog = (Button) findViewById(R.id.addLog);
addLog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("logTag", Integer.toString(count));
count ++ ;
}
});
}
Я хочу начать сохранять журнал моего приложения, используя start
кнопку и остановить его с помощью stop
, addLog
кнопка используется, чтобы увидеть, если дополнительные строки добавляются к log.txt
файл. start
кнопка работает правильно, но проблема в том, что она никогда не заканчивается stop
, Даже после нажатия stop
когда я нажимаю addLog
кнопку и проверьте log.txt
файл, я вижу, последние строки были добавлены. В чем я виновата?
Мне нужно запустить поток, закрыть это занятие и совершить экскурсию по другим занятиям, затем вернуться и выключить регистратор.
2 ответа
Просто используйте метод @hegazy и сохраните ссылку на процесс в своем классе Application. Не забудьте зарегистрировать это в своем манифесте. Надеюсь, у тебя есть моя идея.
Что-то вроде того:
((App)getApplicationContext).process = Runtime.getRuntime().exec(cmd);
и тогда возьмите это, когда вам это нужно:
((App)getApplicationContext).process.exec("logcat -d");
Да, вы можете достичь этого, сохранив Process в переменной, которая возвращается методом exec() и вызовом Runtime destroy()
на этой переменной.
публичная аннотация void destroy ()
Завершает этот процесс и закрывает все связанные потоки.
Давайте запишем процесс как глобальную переменную;
private Process p;
и при его выполнении
p = Runtime.getRuntime().exec(cmd);
и вот как это остановилось.
void stopProcess() {
if (p != null) {
p.destroy();
} else {
Log.d(TAG, "stopProcess: p==null");
}
}