Blackberry's Timer
очень сырный - он похож на Runnable
с Thread.sleep()
внутри.Очень часто для Blackberry, он содержит много дерьма, которое вам на самом деле не нужно, и не содержит вещей, которые вам нужно нужны.
Я бы бросил Timer и создал бы класс специально для моегонужно:
abstract public class MyTimer extends Thread {
private final Object waitobj = new Object();
private volatile boolean running;
private volatile boolean canceled;
private final long due;
public MyTimer setDelay(long delay) {
long cur = System.currentTimeMillis();
due = cur + delay;
return this;
}
public MyTimer setAlarmTime(long dueTimeMillis) {
due = dueTimeMillis;
return this;
}
synchronized void setIsRunning(boolean running) {
this.running = running;
}
synchronized public boolean isRunning() {
return running;
}
synchronized public void cancel() {
synchronized (waitobj) {
canceled = true;
waitobj.notify();
}
}
public void run() {
setIsRunning(true);
long cur = System.currentTimeMillis();
long sleep = due - cur;
while (sleep > 0) {
synchronized (waitobj) {
waitobj.wait(sleep);
}
if (isCanceled()) return;
cur = System.currentTimeMillis();
sleep = due - cur;
}
alarm();
setIsRunning(false);
}
private boolean isCanceled() {
return canceled;
}
abstract void alarm();
}
Тогда я бы вызвал это так:
timer = new MyTimer() {
void alarm() {
// do cool things
}
};
timer.setDelay(10000).start();
Если бы мне нужно было отменить это, я бы сделал это так:
if (timer.isRunning()) {
timer.cancel();
}
или просто
timer.cancel();
PS: Примечание volatile
и synchronized
вещи в классе MyTimer.