从cancel方法的文档中:
(松散地说,如果此方法阻止执行一个或多个计划的执行,则返回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)
我不知道如何解决此问题,并且我已经浏览了其他类似的问题,但没有任何效果。有任何想法吗?
您 不能 重复使用timertask。创建的新实例TimerTask。
TimerTask