2016-07-25 65 views
0

让我们假设我在下面有一个类。首先我有一个CountDownTimer在公共范围内,但它现在为空,我有一个startCountDownTimer方法来启动我的CountDownTimer,在startCountDownTimer方法我设置我的countdowntimer但之后,我想取消countdowntimer当用户点击后退按钮,但你知道我创建了我的变量在公共范围内,它的null,所以当我试图取消我的方法之外的CountDownTimer我得到NullPointerException,那么我该如何取消我的CountDownTimer? (我不想在公共范围内创造了我所有的CountDownTimer我怎样才能取消我的方法以外的CountDownTimer?

public class test { 

    CountDownTimer countdowntimer; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     startCountDownTimer(); 
    } 

    void startCountDowntimer(){ 

     countdowntimer = new CountDownTimer(10000, 1) { 
      @Override 
      public void onTick(long millisUntilFinished) { 
       minText.setText(formatTimeMinutes(millisUntilFinished)); 
       secondsText.setText(formatTimeSeconds(millisUntilFinished));    
      } 

      @Override 
      public void onFinish() { 
       Toast.makeText(this,"Timer Finished",Toast.LENGTH_LONG).show(); 
      } 
     }.start(); 

    } 

    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
     countdowntimer.cancel(); 
    }  
} 
+0

不要初学者提醒我们,但*请*,使用一些标点符号将您的问题陈述改为可理解的句子。 – lenz

+0

大写,代码空白 – jwvh

回答

0

尝试用布尔值解决这个问题。

当您尝试呼叫countdowntimer.cancel()countdowntimer未初始化时,您将收到NullPointerException。所以让我们这样做,除非countdowntimer被初始化,否则那行代码不能被执行。

声明countdowntimer声明后的全局布尔值。

Boolean timerOn = false;

现在,您startCountdownTimer()方法里面,你开始计时之后,在timerOn布尔设置为true

里面你onBackPressed()方法,用这种替换代码:

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    if (timerOn) { 
     countdowntimer.cancel(); 
     timerOn = false; 
    } 
} 

这将确保.cancel方法仅执行时TIMERON布尔是真实的,当定时器初始化它才会发生。