Таймер перепланирования в Android

1

Я пытаюсь иметь таймер, который планирует TimerTask для последовательных исполнений. Я не знаю, сколько раз он будет работать. при щелчке пользователя таймер остановится, а с другой - снова запустится. Все работает до остановки, когда я перепланирую, я получаю исключения, говорящие, что таймер отменен или уже запланирован. Как мне заставить его остановиться и запустить снова? Я пробовал все, что мог придумать, и он все еще не работает.

Это последний код, который я пытаюсь сделать:

        Timer myTimer;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    cameraTimedTask = new camera(this);

        myTimer = new Timer("cameraTimer");

        Button b=(Button)findViewById(R.id.b);
        b.setOnClickListener(new OnClickListener(){
            public void onClick(View v) {
                myTimer.purge();
                myTimer.scheduleAtFixedRate(cameraTimedTask, 1000, 5000);
            }
        });

        Button bb=(Button)findViewById(R.id.button);
        bb.setOnClickListener(new OnClickListener(){
            public void onClick(View v) {
                myTimer.cancel();
                myTimer.purge();
                myTimer = null;
                myTimer = new Timer("camerasTimer");
                Log.i("Check","[main]"+" timer stopped");
            }
        });

    }
Теги:
timer

3 ответа

2
Лучший ответ

Вы не можете перенести TimerTask. Каждый раз вам нужен новый. Кроме того, в android рекомендуется использовать Handlers и postDelayed.

  • 0
    хм, а как я могу запланировать повторяющиеся задачи в обработчиках? он просто задерживает задачу, он не устанавливает период времени для запуска новой после завершения последней.
  • 0
    Обычно они снова вызывают handler.postDelayed () из самой задачи. Чтобы отменить эту периодическую задачу, они вызывают handler.removeCallbacksAndMessages
Показать ещё 3 комментария
1

на мой взгляд, попробуйте использовать таймер обратного отсчета вместо таймера

быстрое использование:

 new CountDownTimer(30000, 1000) {

 public void onTick(long millisUntilFinished) {
     mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
 }

 public void onFinish() {
     mTextField.setText("done!");
 }
}.start();

или если вы хотите что-то более сложное:

 public class MyCountDownTimer extends CountDownTimer {
   public MyCountDownTimer(long startTime, long interval) {
    super(startTime, interval);

  }
  @Override
   public void onFinish() {
   text.setText("Time up!");
  }

  @Override
 public void onTick(long millisUntilFinished) {
 text.setText("" + millisUntilFinished / 1000);

 }

}
0

Идеальное решение для вас - использовать обработчик

private Runnable runnable;
private Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   handler = new Handler();
   runnable = new Runnable() {

    @Override
    public void run() {
          // run code delayed code in here once
    }
};

Затем в вашем коде многопоточности вы должны удалить отправленные обратные вызовы и затем перенести на выполнение.

handler.removeCallbacks(runnable);
handler.postDelayed(runnable, 200);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню