Я пытаюсь иметь таймер, который планирует 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");
}
});
}
Вы не можете перенести TimerTask. Каждый раз вам нужен новый. Кроме того, в android рекомендуется использовать Handlers и postDelayed.
на мой взгляд, попробуйте использовать таймер обратного отсчета вместо таймера
быстрое использование:
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);
}
}
Идеальное решение для вас - использовать обработчик
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);