如何检查计时器是否在黑莓上运行

时间:2011-08-30 09:56:42

标签: blackberry java-me

我已添加计时器以在我的应用中显示图片。

有没有办法检查计时器是否正在运行。

检查后,应使用timer.cancel()方法取消计时器。

请告诉我。

3 个答案:

答案 0 :(得分:1)

您可以通过记录定时器唯一整数来自行管理,稍后再使用它来取消。我找到一个有用的地方设置/取消这是在onVisibilityChanged(布尔)覆盖。我假设你的定时图像用于动画。

// start
if (renderLoop==-1) renderLoop = UiApplication.getUiApplication().invokeLater( this, 50, true );

// stop
if (renderLoop!=-1) 
{
  UiApplication.getUiApplication().cancelInvokeLater( renderLoop );
  renderLoop = -1;
}

//assumes your screen implements Runnable
public void run() {
   // do something cool
}

答案 1 :(得分:1)

Blackberry的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:注意MyTimer课程中的volatilesynchronized内容。

答案 2 :(得分:0)

假设您使用Swing在Java中编程,您在Timer类中有一个名为 isRunning()的方法。

http://download.oracle.com/javase/7/docs/api/javax/swing/Timer.html#isRunning%28%29

此致