2015-12-16 2 views
0

Когда я нажимаю кнопку «Назад», мой таймер все еще работает.Остановите поток, когда пользователь нажимает кнопку «Назад»

для остановки нити я стараюсь: interput() в OnDestroy(), OnPause() и onBackPressed() не работает, и я получаю проникнуть 'зайцем'

косяк использование и посмотреть?! cancel() (В некоторых проблемах, как я сказал, используйте Cancel(), но не знаю, почему я не вижу, когда я нажимаю «myThread.?»)

Я также пытаюсь выполнить неправильное условие во время цикла, но не решить мою проблему. (Там была одна разницы с предыдущим способом, который после нажатия кнопки я увидел крах моего приложения назад!)

и это мой код я написал:

counterTime = 11; 

    while (counterTime > 0) { 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     counterTime--; 
     if (txtTimer != null) { 
      G.HANDLER.post(new Runnable() { 

       @Override 
       public void run() { 
        int min = (int) Math.floor(counterTime/60); 
        int sec = counterTime % 60; 

        String secPerfix = ""; 
        if (sec < 10) { 
         secPerfix = "0"; 
        } 
        txtTimer.setText(min + ":" + secPerfix + sec); 

       } 
      }); 
     } 
    } 

private synchronized void stopThread() { 
    if (threadTimer != null){ 
     threadTimer.interrupt(); 

    } 
} 

@Override 
public void onBackPressed() { 
    stopThread(); 
    super.onBackPressed(); 
} 

Спасибо.

ответ

1

Ваш код выглядит скромно нормально. Когда вы вызываете stopThread, вы отправляете прерывание Exception, но не прерываете цикл while. Сделайте это:

catch (InterruptedException e) { 
      e.printStackTrace(); 
//break out of the while loop and end gracefully 
      break;  
    } 
+0

еще лучше, поставить попробовать { } ловить за пределами цикла while – ControlAltDel

1

попробовать этот

counterTime = 11; 

Timer timer = new Timer(); 
TimerTask timertask = new TimerTask() { 
    @Override 
    public void run() { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       if (counterTime > 0) { 
        counterTime--; 
        if (txtTimer != null) { 
         int min = (int) Math.floor(counterTime/60); 
         int sec = counterTime % 60; 
         String secPerfix = ""; 
         if (sec < 10) { 
         secPerfix = "0"; 
         } 
         txtTimer.setText(min + ":" + secPerfix + sec); 
        } 
       } 
      } 
     }); 
    } 
}; 
timer.scheduleAtFixedRate(timertask, 0, 1000); 

А на задней панели прессованные

@Override 
public void onBackPressed() { 
    if(timertask!=null){ 
     timertask.cancel(); 
     timertask = null; 
    } 
    if(timer!=null){ 
     timer.cancel(); 
     timer = null; 
    } 
    super.onBackPressed(); 
} 

Документация
1. Timer
2. TimerTask