用户按后退按钮时停止线程

时间:2015-12-16 19:37:09

标签: java android multithreading countdowntimer

当我按下后退按钮时,我的计时器仍在运行。

对于停止线程我尝试: onDestroy()中的interput(),onPause()和onBackPressed()不起作用,我崩溃了

无法使用并看到?!取消()(在像我这样的一些问题中说使用取消()但不知道为什么我不能看到我按“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();
}

感谢。

2 个答案:

答案 0 :(得分:2)

试试这个

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

答案 1 :(得分:1)

您的代码看起来不错。当你调用stopThread时发送一个interruptionException,但是你没有打破while循环。这样做:

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