暂停和恢复AsyncTasks? (机器人)

时间:2010-03-19 02:12:48

标签: java android

我有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)`

不确定这是否是最佳方式,但它对我有用。

3 个答案:

答案 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,

  1. 我不认为AsyncTask可以恢复。至于暂停,我试图使用AsyncTask.cancel(true)来停止正在运行的任务。取消后我使用AsyncTask.isCancelled()来检查它是否被取消。它返回了真实;但是,AsyncTask仍在运行。