暂停和恢复异步任务?(Android)

5
我有一个AsyncTask作为游戏倒计时器。当它完成倒计时,它会显示时间到结束屏幕,并更新屏幕上显示的计时器。一切都很好,但是当按下游戏中的暂停按钮时,我需要能够暂停和恢复计时器。
如果我取消它并尝试重新执行它,它会崩溃并出现IllegalStateException异常。如果我取消它并在其位置实例化一个新的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个回答

14
我有一个作为游戏倒计时器的AsyncTask。这不是一个好的AsyncTask使用方式。 AsyncTasks应该完成工作并退出,而不是试图挂起。对于倒计时器,请使用postDelayed() - 甚至不需要后台线程。或者,使用CountDownTimer
如果我取消它并尝试重新执行它,它会崩溃并显示IllegalStateException。documentation声明:“任务只能被执行一次(如果尝试第二次执行,则会抛出异常)”。

感谢提供的信息。我研究了postDelayed()和Handlers,我认为我找到了一个合适的解决方案。 - Matt Swanson
@Matt Swanson,您能否通过更新上面的帖子分享适当的解决方案? - eros

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();
        }
    }

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接