我有AsyncTask
作为我游戏的倒数计时器。当它完成倒计时时,它会显示超时结束屏幕,它还会更新屏幕上显示的计时器。一切正常,但我需要能够在按下游戏中的暂停按钮时暂停和恢复此状态。
如果我取消它并尝试重新执行它,它会以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)`
不确定这是否是最佳方式,但它对我有用。
答案 0 :(得分:13)
我有一个AsyncTask充当 我的游戏的倒数计时器。
这不是AsyncTask
的好用。 AsyncTasks
应该做好工作并完成,不要试着闲逛。对于倒数计时器,请使用postDelayed()
- 您甚至不需要后台线程。或者,使用CountDownTimer
。
如果我取消它并尝试重新执行 它,它崩溃了 IllegalStateException异常。
documentation状态:“任务只能执行一次(如果尝试第二次执行则会抛出异常。)”
答案 1 :(得分:5)
嗨这是另一个暂停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();
}
}
答案 2 :(得分:1)
致JaySS,