暂停计时器并恢复



这是我用来控制间隔的计时器类。欢迎你们中的任何人使用它。

我遇到的问题是我的暂停和简历。它正确分配,但是当我尝试使用我的 resume() 时,它不会恢复时间。知道为什么吗?

    public class Timer implements IUpdateHandler {
        // ===========================================================
        // Constants
        // ===========================================================
        // ===========================================================
        // Fields
        // ===========================================================
        private final ITimerCallback    mCallback;
        private float                                   mInterval;
        private float                                   mSecondsElapsed;
        protected boolean                               mPause  = false;
        private float                                   pausedSecond;
        // ===========================================================
        // Constructors
        // ===========================================================
        public Timer(final float interval, final ITimerCallback pCallback) {
        this.mInterval = interval;
        this.mCallback = pCallback;
        }
        // ===========================================================
        // Getter & Setter
        // ===========================================================
        public void setInterval(final float pInterval) {
        this.mInterval = pInterval;
        }
        // ===========================================================
        // Methods for/from SuperClass/Interfaces
        // ===========================================================
        @Override
        public void onUpdate(float pSecondsElapsed) {
        this.mSecondsElapsed += pSecondsElapsed;
        if (this.mSecondsElapsed >= this.mInterval) {
        if (!this.mPause) {
        this.mSecondsElapsed -= this.mInterval;
        this.mCallback.onTick();
        }
        }
        }
        @Override
        public void reset() {
        this.mSecondsElapsed = 0;
        }
        // ===========================================================
        // Methods
        // ===========================================================
        // ===========================================================
        // Inner and Anonymous Classes
        // ===========================================================
        public interface ITimerCallback {
                public void onTick();
        }
        public void pause() {
        this.mPause = true;
        this.pausedSecond = this.mSecondsElapsed;
        }
        public void resume() {
        if (this.mPause) {
        this.mSecondsElapsed = this.pausedSecond;
        this.mPause = false;
        } else {
        // not paused
        }
        }
}

scen 说了什么

    @Override
    public void onUpdate(float pSecondsElapsed) {
        this.mSecondsElapsed += pSecondsElapsed;
        if (this.mSecondsElapsed >= this.mInterval) {
            if (!this.mPause) {
                this.mSecondsElapsed -= this.mInterval;
            }
            this.mCallback.onTick();
        }
    }

这应该可以解决问题;只需将onTick移到外面,如果它没有暂停

我将在这里冒昧地走一截,因为我看不到驱动计时器的onUpdate函数如何调用的代码,并且我对您使用的IUpdateHandler接口知之甚少。

看起来你只是在计时器没有暂停的情况下调用mCallback.onTick()。

但是,如果 onTick 设置了对计时器的 onUpdate 函数的下一次调用,那么当您暂停它并且它"滴答"时,它不会调用 onTick 方法并设置对该函数的下一次调用。

最新更新