2015-07-07 5 views
0

Извините за мой английский. У меня есть таймер и я палочка, если я нажимаю кнопку таймера, если я снова нажму таймер. Но мой таймер только один раз. Если я снова нажмите (Таймер выключения) у меня есть исключения вроде этого:Таймер остановки и запуска

E/AndroidRuntime﹕ FATAL EXCEPTION: main 
java.lang.IllegalStateException: Timer was canceled 
    at java.util.Timer.scheduleImpl(Timer.java:561) 
    at java.util.Timer.schedule(Timer.java:481) 
    at installation.ConnectDevice.callAsynchronousTask(ConnectDevice.java:211) 
    at installation.ConnectDevice$1.onClick(ConnectDevice.java:153) 
    at android.view.View.performClick(View.java:4240) 
    ... 

Я не знаю, почему его не работает, пожалуйста, помогите. Ниже мой класс

Мой класс

private Timer timer; 
int time = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.i_connect_device); 

    timer = new Timer(); 

    // my botton 
    includeDevice.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (time < 1) { 
       callAsynchronousTask(); 
       time++; 
      } 

      if (time > 0) { 
       stopTimer(); 
       time--; 
      } 
     } 
    }); 

} 

public void callAsynchronousTask() { 
    final Handler handler = new Handler(); 

    TimerTask doAsynchronousTask = new TimerTask() { 
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
        try { 
         Log.e("Timer is work", "Timer is work"); 
         // GetMsgs performBackgroundTask = new GetMsgs(); 
         // PerformBackgroundTask this class is the class 
         // that extends AsynchTask 
         // performBackgroundTask.execute(); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer.schedule(doAsynchronousTask, 0, 1000 * 10); // execute in every 
                 // 50000 ms 
} 

public void stopTimer() { 
    timer.cancel(); 
} 

ответ

1

Изменение OnClick логики следующим образом (потому что в вашем случае в первый раз выполняется только callAsynchronousTask() и StopTimer(). Так что это вызывает исключение при следующем OnClick)

btnTimer.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (time == 0) { 
        callAsynchronousTask(); 
        time = 1; 
       } else { 
        stopTimer(); 
        time = 0; 
       } 
      } 
     }); 

и doAsynchronousTask сделать это полем и отменить задачу на stopTimer().

public void stopTimer() { 
    doAsynchronousTask.cancel(); 
} 

тогда он отлично работает.

0

От Javadocs:

CANCEL(): Завершает этот таймер, отбрасывая все текущие задачи по расписанию. [...] Как только таймер был завершен, его исполнительный поток прерывается изящно, и на нем не может быть запланировано больше задач.

и

график (задача задач, длительная задержка)
бросает:
IllegalStateException - если задача уже была запланирована или отменена, таймер был отменен, или таймер поток прекращается.

Так как ваш класс говорит вам, что он не может выполнить заданную задачу из-за того, что таймер был отменен. Что-то, что вы могли бы попробовать, это сделать таймер спящим, пока кнопка не будет нажата снова, вместо того, чтобы полностью ее отменить.

0

Как только вы отмените таймер; вы не можете запустить его снова, потому что поток остановлен.
Смотрите ссылку:
Pause the timer and then continue it
Вы должны поддерживать состояние каким-то образом и заново таймер с текущим значением

0

вам нужна задача асинхронным это класс, так что вы можете продлить его. Открытый класс callAsynchronousTask расширяет асинхронную задачу И GetMsgs performBackgroundTask = new GetMsgs(); // PerformBackgroundTask этот класс является классом, который расширяет панель задач Async, вступает в фоновый метод

0

Инициализировать объект таймера внутри callAsynchronousTask, как показано ниже.

public void callAsynchronousTask() { final Обработчик обработчика = новый обработчик();

TimerTask doAsynchronousTask = new TimerTask() { 
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
        try { 
         Log.e("Timer is work", "Timer is work"); 
         //GetMsgs performBackgroundTask = new GetMsgs(); 
         // PerformBackgroundTask this class is the class that extends AsynchTask 
         //performBackgroundTask.execute(); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer=new Timer(); 
    timer.schedule(doAsynchronousTask, 0, 1000*10); //execute in every 50000 ms 
} 

Также измените свой блок, потому что он выполняет оба условия.

Используйте логический флаг вместо INT

boolean isTimerRunning; 

    if (!isTimerRunning) { 
      callAsynchronousTask(); 
      isTimerRunning=true; 
     } 

     else (isTimerRunning) { 
      stopTimer(); 
      isTimerRunning=false; 
     } 
Смежные вопросы