2015-05-20 2 views
2
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 , я вижу, что последние строки были добавлены. В чем моя вина?Как остановить исполняемой в данный момент команду

Мне нужно запустить поток, закрыть это мероприятие и совершить экскурсию по другим видам деятельности, затем вернуться и закрыть машину регистрации.

ответ

1

Просто используйте @hegazy метод и сохранить ссылку на обработку в вашем Application классе. Не забудьте указать register в своем манифесте. Надеюсь, у тебя есть моя идея.

Нечто подобное:

((App)getApplicationContext).process = Runtime.getRuntime().exec(cmd); 

и чем принять это, когда вам это нужно:

((App)getApplicationContext).process.exec("logcat -d"); 
+0

Спасибо, это сработало. Теперь у меня новая проблема. Если пользователь закрывает мое приложение, весь процесс приложения будет уничтожен, но машина регистрации еще находится в сети. И тогда ссылка на объект 'process' теряется, и я не могу остановить поток после повторного открытия моей активности. Вы можете мне помочь? – Mohsen

+0

Это другой вопрос. Закройте это и запустите новый. Не забудьте отметить мой ответ как правильный – Divers

2

Да, вы можете достичь этого, сохранив процесс в переменной, возвращаемой методом exec() Runtime, и вызовите destroy() на эту переменную.

общественного абстрактного недействительными уничтожить()

завершает этот процесс и закрывает все связанные с ним потоков.

Запишите процесс как глобальную переменную;

private Process p; 

и при выполнении его

p = Runtime.getRuntime().exec(cmd); 

и это, как он остановился.

void stopProcess() { 
    if (p != null) { 
     p.destroy(); 
    } else { 
     Log.d(TAG, "stopProcess: p==null"); 
    } 
} 
+0

Большое спасибо. Я знаю, что это сработает, но у меня есть еще одна проблема, которая мешает мне использовать метод, который вы объяснили. Мне нужно запустить поток, закрыть это мероприятие и совершить экскурсию по другим видам деятельности, затем вернуться и закрыть машину регистрации. Вы можете мне помочь? @hegazy – Mohsen

+0

ответь пожалуйста? – Mohsen

+0

Извините, я не был доступен. У вас все еще есть проблемы? –

Смежные вопросы