繁体   English   中英

暂停并恢复AsyncTasks? (Android)

[英]Pause and Resume AsyncTasks? (Android)

我有一个AsyncTask ,它充当游戏的倒数计时器。 完成倒数计时后,它会显示超时屏幕,并更新屏幕上显示的计时器。 一切正常,除了在按下游戏中的暂停按钮时我需要能够暂停并继续执行此操作。

如果我取消它并尝试重新执行它,它将崩溃,并IllegalStateException 如果我取消它并在其位置实例化一个新的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。

文档指出:“该任务只能执行一次(如果尝试第二次执行,则将引发异常。)”

你好
这是暂停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,

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM