关于Task already scheduled or canc

2020-04-21  本文已影响0人  不做android

java.lang.IllegalStateException Task already scheduled or cancelled出现的原因主要是是因为TimerTimerTask都是一次性的消耗品,在调用cancle之后再次进行任务调度时就需要重新new新的timertask

private void initCursorTimer() {
        mCursorTimerTask = new TimerTask() {
            @Override
            public void run() {
                // 通过光标间歇性显示实现闪烁效果
                isCursorShowing = !isCursorShowing;
                postInvalidate();
            }
        };
        mCursorTimer = new Timer();
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        initCursorTimer();
        // 启动定时任务,定时刷新实现光标闪烁
        mCursorTimer.scheduleAtFixedRate(mCursorTimerTask, 0, mCursorDuration);
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (mCursorTimer != null) {
            mCursorTimer.cancel();
            mCursorTimer.purge();
            mCursorTimer = null;
        }
    }

这里需要注意的是调用timer的cancle方法时,还需要调用purge方法

@Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        mCursorTimerTask = new TimerTask() {
            @Override
            public void run() {
                // 通过光标间歇性显示实现闪烁效果
                isCursorShowing = !isCursorShowing;
                postInvalidate();
            }
        };
        // 启动定时任务,定时刷新实现光标闪烁
        mCursorTimer.scheduleAtFixedRate(mCursorTimerTask, 0, mCursorDuration);
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (mCursorTimerTask != null) {
            mCursorTimerTask.cancel();
            mCursorTimerTask = null;
        }
    }

purge方法就是用来释放内存引用的。purge方法会检查timer队列里标记为canceled的task,将对它的引用置为null。

上一篇 下一篇

猜你喜欢

热点阅读