尝试安排计时器时出现 IllegalStateException

2024-04-08

从取消方法的文档中:

(宽松地说,如果该方法阻止一个或多个计划执行的发生,则该方法返回 true。)

当我执行这段代码时:

private Timer timer = null;
private TimerTask runnable = new TimerTask() {
    @Override
    public void run() {
        Log.e("DEBUG", "Scheduled task tick");
        if(!looper){
            Looper.prepare();
            looper = true;
        }
        VolleyConnect vc = new VolleyConnect();
        vc.connect(ErrorListActivity.this);
    }
};

@Override
public void onWindowFocusChanged(boolean focus){
    if(!focus){
        kill();
    }else{
        start();
    }
    Log.e("DEBUG", "FOCUS " + focus);
}

public void start(){
    if(timer == null){
        timer = new Timer();
        //180000 ms = 3 minutes
        timer.scheduleAtFixedRate(runnable, 0L, 180000L);<--- This line is the one that triggers the error.
    }
}

public void kill(){
    if(timer != null) {
        boolean rep = runnable.cancel();
        Log.e("DEBUG", "REP = " + rep);
        timer.cancel();
        timer = null;
        looper = false;
    }
}

出乎意料的是,调试语句打印出:

E/DEBUG: REP = true

这表明取消应该完成。但是,当我重新获得窗口焦点(并尝试重新安排计时器)时,应用程序崩溃并出现以下错误:

java.lang.IllegalStateException: Task already scheduled or cancelled
    at java.util.Timer.sched(Timer.java:401)
    at java.util.Timer.scheduleAtFixedRate(Timer.java:328)
    at com.package.ErrorListActivity.start(ErrorListActivity.java:198)
    at com.package.ErrorListActivity.onWindowFocusChanged(ErrorListActivity.java:189)
    at android.support.v7.view.WindowCallbackWrapper.onWindowFocusChanged(WindowCallbackWrapper.java:128)
    at android.support.v7.view.WindowCallbackWrapper.onWindowFocusChanged(WindowCallbackWrapper.java:128)
    at com.android.internal.policy.DecorView.onWindowFocusChanged(DecorView.java:1414)
    at android.view.View.dispatchWindowFocusChanged(View.java:10173)
    at android.view.ViewGroup.dispatchWindowFocusChanged(ViewGroup.java:1192)
    at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3757)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6120)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

我不知道如何解决这个问题,并且我已经查看了其他类似的问题,但还没有任何效果。有任何想法吗?

Incidentally, this is not a duplicate of this question https://stackoverflow.com/questions/23648258/java-lang-illegalstateexception-timertask-is-scheduled-already-rationally-usin. It is the same issue, but I call cancel and it returns true (meaning it should work, but it doesn't).


You can not重用定时器任务。创建新实例TimerTask.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试安排计时器时出现 IllegalStateException 的相关文章

随机推荐