2015-08-24 68 views
0

我想要開始CountDownTimer如果我的高度變化超出我使用氣壓計設置的值範圍。如果還有&&陳述不在裏面SensorManager

因此,例如,如果該值是> 40和43 <,沒有動作
如果該值是< 41和> 42,countdowntimer將開始滴答作響。
但是,如果值返回到41-42內部,那麼定時器將停止滴答等等。

這裏是我的代碼:

public SensorEventListener sensorEventListener = new SensorEventListener() { 
    @Override 
    public void onSensorChanged(SensorEvent event) { 
     float pressure_value = 0.0f; 
     float height = 0.0f; 
     if (Sensor.TYPE_PRESSURE == event.sensor.getType()) 
     { 
      pressure_value = event.values[0]; 
      height = SensorManager.getAltitude(1009,pressure_value); 
     } 
     value = String.valueOf(height); 
     txtBaro.setText(value); 
     valueOftxtBaro = Float.parseFloat(value); 
     if (valueOftxtBaro < 41 && valueOftxtBaro > 42) 
     { 
      actCountDownTimer(); 
     } 
     else if (valueOftxtBaro < 43 && valueOftxtBaro > 40) 
     { 
      cdt.cancel(); <------------------Here is line 202------------> 
      txtTest.setText("Paused"); 
     } 
     else 
     { 
      txtTest.setText("Null"); 
     } 

    } 

這是CountDownTimer代碼:

public void actCountDownTimer() 
    { 
     cdt = new CountDownTimer(total,1000) { 
      @Override 
      public void onTick(long millisUntilFinished) { 
       total = millisUntilFinished; 
      } 

      @Override 
      public void onFinish() { 

      } 

當我運行這段代碼我得到一個錯誤:

Attempt to invoke virtual method 'void android.os.CountDownTimer.cancel()' on a null object reference 
      at skripsi.ubm.studenttracking.indoor$3.onSensorChanged(indoor.java:202) 
      }.start(); 
     } 

你能不能幫我解決這個?

回答

0

如果您的valueOftxtBaro> 40和< 43在第一次您的onSensorChanged(SensorEvent事件)方法被偵聽器調用,它將調用cdt.cancel(),雖然cdt尚未初始化(它只是在上部分支)。嘗試,來代替:

public SensorEventListener sensorEventListener = new SensorEventListener() { 
    @Override 
    public void onSensorChanged(SensorEvent event) { 
     float pressure_value = 0.0f; 
     float height = 0.0f; 
     if (Sensor.TYPE_PRESSURE == event.sensor.getType()) 
     { 
      pressure_value = event.values[0]; 
      height = SensorManager.getAltitude(1009,pressure_value); 
     } 
     value = String.valueOf(height); 
     txtBaro.setText(value); 
     valueOftxtBaro = Float.parseFloat(value); 
     if (valueOftxtBaro < 41 && valueOftxtBaro > 42) 
     { 
      actCountDownTimer(); 
     } 
     else if (valueOftxtBaro < 43 && valueOftxtBaro > 40) 
     { 
      if (cdt != null) 
       cdt.cancel(); 

      txtTest.setText("Paused"); 
     } 
     else 
     { 
      txtTest.setText("Null"); 
     } 

    } 
0
valueOftxtBaro = Float.parseFloat(value); 
      if (valueOftxtBaro < 41 && valueOftxtBaro > 42){ 

條件valueOftxtBaro < 41 && valueOftxtBaro > 42總是假 - valueOftxtBaro不能< 41和> 42在同一時間。

此外,就像Dimitri所示,在調用cancel方法之前,爲cdt添加空值檢查。

編輯:

即使是如上所述固定的,你的代碼將每一個第一,如果條件爲真時創建一個新的CountDownTimer。只有在尚未創建的情況下,您才應該創建一個新的定時器。嘗試像這樣應該有以上所有固定的東西:

if (valueOftxtBaro < 41 || valueOftxtBaro > 42) { // baro outside range [41, 42] 
    if (cdt == null) { 
     cdt = new CountDownTimer(total, 1000) { 
      @Override 
      public void onTick(long millisUntilFinished) { 
       total = millisUntilFinished; 
      } 
     }; 
     cdt.start(); 
    } 
} else { // baro inside range [41, 42] 
    if (cdt != null) { 
     cdt.cancel(); 
    } 
} 
+0

我寫你的代碼和dimitri代碼。它第一次完美地工作。但是當條件返回false時,倒數計時器開始計時,然後當數值返回true時,倒計時器仍在滴答滴答。它應該怎麼做?如果valueoftxtbaro <42 ||,則爲 –

+0

valueoftxtbaro> 43 {actCountDownTimer();} else if(valueoftxtbaro <44 || valueoftxtbaro> 41) {if(cdt!= null) {cdt.cancel(); }} –

+0

查看更新的代碼示例,它現在能夠工作嗎? – JanneK