Question

i want to have a little blinking flashlight. My problem is : the timer dont want to stop. Either nothing happens, or the app crashes. I searched for hours, all i found was " timer.cancel()" - but it doesnt help.

My Code :

import java.util.Timer;
import java.util.TimerTask;

.
.
.

  public void btn_slow(View view){
        final Camera.Parameters p = camera.getParameters();

    p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
    camera.setParameters(p);

    Timer timer = new Timer();


    switch(flashon) {
        case 1 :        timer.cancel();
                        flashon = 0;
                            p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                            camera.setParameters(p);
                        break;

        case 0:         timer.scheduleAtFixedRate(new TimerTask() {
                        @Override
                        public void run() {

                        timer2.schedule(new TimerTask() {
                        public void run() {
                            p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                            camera.setParameters(p);
                        }
                        }, 2*1000);

                        timer3.schedule(new TimerTask() {
                        public void run() {
                            p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                            camera.setParameters(p);
                        }
                        }, 1*1000);
                        }

                        }, 1*1000, 2*1000);
                        flashon = 1;
                        break;
    }

}    

Hope you can help me.

03-02 22:12:51.379  25515-25616/com.example.app E/AndroidRuntime﹕ FATAL EXCEPTION: Timer-2
java.lang.IllegalStateException: Timer was canceled
        at java.util.Timer.scheduleImpl(Timer.java:561)
        at java.util.Timer.schedule(Timer.java:459)
        at com.example.app.Flashlight$2.run(Flashlight.java:245)
        at java.util.Timer$TimerImpl.run(Timer.java:284)

No correct solution

OTHER TIPS

even when timer has stopped timer2 and timer3 are still running and haven't cancelled. Add this

timer2.cancel();
timer3.cancel();

where there is

timer.cancel();

EDIT

I would just go with one timer like so:

put this as a field on the class

   private boolean running = false;
   private Timer timer = new Timer();

then this code in the method

    boolean on = false;

    final Camera.Parameters p = camera.getParameters();

    p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
    camera.setParameters(p);

if(!running)
    timer.scheduleAtFixedRate(new TimerTask() {
      @Override
      public void run() {
         if(on) {
           on = false;
           p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                                camera.setParameters(p);
         }
         else {
           on = true;
           p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                                camera.setParameters(p);
         }

      }
    }, 1*1000, 2*1000);
}
else {
   timer.cancel();
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top