暂停和恢复AsyncTasks? (机器人)
我有一个AsyncTask
作为我游戏的倒数计时器。 当它完成倒计时时,它会显示超时结束屏幕,并且还会更新屏幕上显示的计时器。 一切正常,但我需要能够在按下游戏中的暂停按钮时暂停和恢复此function。
如果我取消它并尝试重新执行它,它会崩溃并出现IllegalStateException
。 如果我取消它并在其位置实例化一个新的AsyncTask,旧的AsyncTask会再次开始运行,而新的AsyncTask会同时运行。
有没有办法取消/暂停计时器并使用AsyncTask
重新启动它,还是有不同的方法我应该这样做?
编辑:
这就是我为解决方案所做的:
mhandler = new Handler();
mtimerTask = new Runnable(){ public void run(){ mtimer -= 1; if(mtimer == 0) { mhandler.removeCallbacks(this); } mhandler.postDelayed(this, 1000); } }; mhandler.removeCallbacks(mtimerTask); mhandler.post(_timerTask)`
不确定这是否是最佳方式,但它对我有用。
我有一个AsyncTask作为我游戏的倒数计时器。
这不是AsyncTask
的好用。 AsyncTasks
应该工作并完成,而不是试着闲逛。 对于倒计时器,使用postDelayed()
– 你甚至不需要后台线程。 或者,使用CountDownTimer
。
如果我取消它并尝试重新执行它,它会崩溃并出现IllegalStateException。
文档说明:“任务只能执行一次(如果尝试第二次执行则会抛出exception。)”
你好
这是另一个暂停AsyncTask的脏解决方案,它对我有用。
但它并不是一个干净的代码。 在你的类中扩展AsyncTask。
public void pause() { this.isPaused = true; } public void resume() { this.isPaused = false; } @Override protected Void doInBackground(Void... params) { while(!isCancelled()) { while(isPaused) sleep(5000); //... private void sleep(long sleepDuration) { try { Thread.sleep(sleepDuration); } catch(InterruptedException e) { e.printStackTrace(); } }
致JaySS,
- 我不认为AsyncTask可以恢复。 至于暂停,我试图使用AsyncTask.cancel(true)来停止正在运行的任务。 取消后,我使用AsyncTask.isCancelled()来检查它是否被取消。 它返回了真实; 但是,AsyncTask仍在运行。