Таймер не останавливается с помощью timer.cancel(). Это вызывает сбой активности

Ниже приведен мой код таймера, чтобы светодиод мигал.

Вот логика, стоящая за этим:

case MotionEvent.ACTION_DOWN должен запустить прошивку. case MotionEvent.ACTION_UP должен остановить вспышку

Когда я использую waitTimer.cancel(); программа вылетает.

final Button button = (Button) findViewById(R.id.myImageView);
button.setOnTouchListener(new OnTouchListener() {

@Override
 public boolean onTouch(View v, final MotionEvent event) {
    switch (event.getAction()) {

        case MotionEvent.ACTION_DOWN:

        //Flash ON
        CountDownTimer waitTimer;
        waitTimer = new CountDownTimer(3000, 25) {

        public void onTick(long millisUntilFinished) {
            final Parameters p = camera.getParameters();
            if (!isLighOn) {
                p.setFlashMode(Parameters.FLASH_MODE_ON);
                p.setFlashMode(Parameters.FLASH_MODE_TORCH);
                camera.setParameters(p);
                isLighOn = true;
            } else {
                p.setFlashMode(Parameters.FLASH_MODE_OFF);
                camera.setParameters(p);
                isLighOn = false;
            }
        }

        public void onFinish() {
            final Parameters pp = camera.getParameters();
            pp.setFlashMode(Parameters.FLASH_MODE_OFF);
            camera.setParameters(pp);
            isLighOn = false;  
            isPlaying = false;
            }
        }.start();

    }
  }     
}

break;

case MotionEvent.ACTION_UP:

    //Flash OFF
    waitTimer.cancel();
    waitTimer = null;
    final Parameters pp = camera.getParameters();
    pp.setFlashMode(Parameters.FLASH_MODE_OFF);
    camera.setParameters(pp);
    isLighOn = false;
    }
return false;
}
});

person وليد عبد العزيز    schedule 17.08.2015    source источник
comment
Почему бы не показать нам трассировку стека сбоя и код, который его производит?   -  person ci_    schedule 17.08.2015
comment
Я обновил свой вопрос и код, чтобы быть более ясным.   -  person وليد عبد العزيز    schedule 18.08.2015


Ответы (1)


Похоже, это так: https://stackoverflow.com/a/10810847/5220092

Вы должны написать объявление над блоком переключателей:

CountDownTimer waitTimer = null;
switch(event.getAction()){
...
}

и вставьте нулевую проверку перед вызовом отмены() на таймере:

if(waitTimer != null){
waitTimer.cancel();
}
person corvus    schedule 17.08.2015
comment
Когда я вставляю нулевую проверку перед вызовом отмены() на таймере: он ничего не сделал. Это не приводит к сбою активности, потому что кажется, что оно равно нулю, хотя мигание все еще включено. - person وليد عبد العزيز; 18.08.2015
comment
Вы объявили переменную waitTimer над блоком переключателей? В противном случае waitTimer всегда будет нулевым. - person corvus; 18.08.2015