尝试安排计时器时发生IllegalStateException [英] IllegalStateException when trying to schedule a timer
问题描述
从cancel方法的文档中:
From the documentation of the cancel method:
(松散地说,如果此方法阻止执行一个或多个计划的执行,则返回true.)
(Loosely speaking, this method returns true if it prevents one or more scheduled executions from taking place.)
当我执行此代码时:
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;
}
}
出乎意料的是,调试语句打印:
Unexpectedly, the debug statement prints:
E/DEBUG: REP = true
这表明取消应该完成.但是,当我重新获得窗口焦点(并尝试重新安排计时器)时,应用程序因以下错误而崩溃:
which shows that the cancel should be completed. However, when I regain window focus (and try to reschedule the timer), the app crashes with this error:
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)
我不知道如何解决此问题,我已经浏览了其他类似的问题,但是还没有任何解决方法.有什么想法吗?
I have no clue how to fix this, and I have looked through the other similar questions but nothing has worked yet. Any ideas?
顺便说一句,这不是这个问题的重复项.这是相同的问题,但是我叫cancel,并且它返回true(这意味着它应该工作,但是不行).
Incidentally, this is not a duplicate of this question. It is the same issue, but I call cancel and it returns true (meaning it should work, but it doesn't).
推荐答案
您可以不重用timertask.创建 TimerTask
的新实例.
You can not reuse the timertask . Create new instance of TimerTask
.
这篇关于尝试安排计时器时发生IllegalStateException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!