2013-02-22 3 views
2

Моя проблема в том, что ... У меня есть 2 события .. onCreate и Onclick. У меня есть поток, выполняемый внутри onCreate, и я должен остановить его внутри onClick. Это возможно? Если да, предоставьте мне некоторые подсказки/фрагменты кода, как это реализовать.Остановка темы в другом событии

Мой код в OnCreate случае это: -

protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_screen); 

    button = (Button) findViewById(R.id.btn); 
     button.setOnClickListener(this); 
     try{ 
      bright = Settings.System.getInt(getContentResolver(), 
        Settings.System.SCREEN_BRIGHTNESS); 
      }catch(Exception ex){ 
       ex.printStackTrace(); 
       bright = 1.0f; 
      } 


     lp = getWindow().getAttributes(); 
     new Thread(new Runnable(){ 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      while (true) { 
       try { 
        Thread.sleep(10000); 
        mHandler.post(new Runnable() { 

         @Override 
         public void run() { 
          // TODO Auto-generated method stub 
          lp.screenBrightness= dim; 
          getWindow().setAttributes(lp); 
          // SLEEP 2 SECONDS HERE ... 
          final Handler handler = new Handler(); 
          Timer t = new Timer(); 

          t.schedule(new TimerTask() { 
            public void run() { 
              handler.post(new Runnable() { 
                public void run() { 
                lp.screenBrightness=bright; 
                getWindow().setAttributes(lp); 
                } 
              }); 
            } 
          }, 2000); 

         } 
        }); 
       } catch (Exception e) { 
        // TODO: handle exception 
       } 
      } 

     } 

     }).start(); 

    } 

эта деятельность выполняется внутри цикла. И я хочу остановить это, я нажимаю на кнопку. Кажется, что я не могу вызвать метод Thread.interrupt() внутри кнопки onclick. Как я могу это исправить?

+0

[android лучший и безопасный способ остановить поток] (http://stackoverflow.com/questions/8505707/android-best-and-safe-way-to-stop-thread) –

+0

@Bhuro: я обновил мой вопрос. спасибо за ссылку anyways – newbee

+0

FWIW, создавая Handler и Timer и TimerTask кажется излишним. Могли бы опустить Timer и TimerTask, просто выполните 'handler.postDelayed (новый Runnable() {..}, 2000);'? – ToolmakerSteve

ответ

1
  1. Объявите в своем классе booleanmRunnning, это как флаг, и пользовательские бегущий поток будет зависеть от того, чтобы это знать, если он был отменен.

  2. Как обычно, у вас есть петля в вашей теме, а не while(true) do while(mRunning).

  3. Кроме того, вы делаете свою нить спать, во время сна нить не сможет проверить переменную mRunning, вам нужно будет позвонить interrupt() на объект темы, чтобы остановить ее.

  4. Это будет лучше использовать переменную для хранения Ссылки Thread Thread t = new Thread(....

  5. Итак, теперь, чтобы остановить поток, вы должны вызвать mRunning = false и затем t.interrupt().

+0

, когда я использую ссылку на поток myThread = new Thread (new Runnable ..., i получите это сообщение, показывая «Тип несоответствия: невозможно преобразовать из void в Thread» – newbee

1

Если вы создаете ссылку, вы можете получить к ней доступ со всего мира. Итак, в классе тела что-то вроде

Thread thrd 

Так же, как вы делали бы это с помощью Button, TextView или любого другого. Затем в OnCreate метод добавить ссылку как

thrd = new Thread(new Runnable(){ 

Теперь у вас есть ссылка на ваш поток можно использовать везде в вашем классе.

+0

, когда я пытаюсь использовать этот myThread = new Thread (new Runnable() {, я получаю это сообщение «Тип несоответствия: невозможно преобразовать из void в Thread» – newbee

0

вместо
в то время как (истинно)

внутри прогона() Метод, объявить логическую переменную, чтобы верно и изменить его после того, как OnClick. Например:

 private boolean shouldRun = true; 

затем в методе Run():

 @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     while (shouldRun==true) { 
        . 
        . 
        . 

и в вашем OnClick:

 @override 
      public void OnClick(View v){ 

       shouldRun=false; 
         . 
         . 
         . 
+0

, когда я использую ссылку на поток myThread = new Thread (new Runnable ..., я получаю это сообщение, показывающее «Несоответствие типа: невозможно преобразовать из void в Thread» – newbee

+0

Вам не нужно ссылаться на поток, если вы следуете моему примеру ... – Opiatefuchs

1

в соответствии с текущей ситуацией на основе предыдущего ответа комментарий. вы пытаетесь:

myThread = new Thread(new Runnable 

Православие?

тогда и вы также должны удалить часть вашего предыдущего кодирования .start();. затем написать:

myThread.start(); 

и должны объявить myThread как глобальный в своем классе, так что и может получить доступ к этой теме из любого места в классе. теперь u может остановить резьбу в onClick

u должен объединить этот ответ и ответить User117.

+0

проблема решена! Большое спасибо :) – newbee

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