如果用&&语句在SensorManager内部无效

时间:2015-08-24 09:55:30

标签: android countdowntimer sensormanager

如果我的高度变为我使用气压计设定的值范围之外,我想开始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();
        }

你能帮我解决这个问题吗?

2 个答案:

答案 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();
    }
}