Остановить поток, когда пользователь нажимает кнопку «Назад»

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

для остановки потока я пытаюсь: 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();
}

Спасибо.


person Majid Mohammadi    schedule 16.12.2015    source источник


Ответы (2)


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

catch (InterruptedException e) {
            e.printStackTrace();
//break out of the while loop and end gracefully
            break;      
  } 
person j2emanue    schedule 16.12.2015
comment
А еще лучше поместите try { } catch вне цикла while - person ControlAltDel; 16.12.2015

попробуй это

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. Таймер
2 . TimerTask

person Deepak Goyal    schedule 16.12.2015