Как остановить текущую команду

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");
     }
}
Другие вопросы по тегам