如果我的高度变为我使用气压计设定的值范围之外,我想开始CountDownTimer
。
因此,例如,如果值为> 40和< 43,没有行动
如果值是< 41和> 42,倒计时器将开始滴答作响。
但是如果值返回到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 :(得分:0)
如果您的valueOftxtBaro是&gt; 40和&lt; 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");
}
}
答案 1 :(得分:0)
valueOftxtBaro = Float.parseFloat(value);
if (valueOftxtBaro < 41 && valueOftxtBaro > 42){
条件valueOftxtBaro < 41 && valueOftxtBaro > 42
始终为false - valueOftxtBaro不能为&lt; 41和&gt; 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();
}
}