【问题标题】:Pause and Resume AsyncTasks? (Android)暂停和恢复异步任务? (安卓)
【发布时间】:2010-03-19 02:12:48
【问题描述】:

我有一个AsyncTask,作为我的游戏的倒计时。当它完成倒计时时,它会显示超时结束屏幕,它还会更新屏幕上显示的计时器。一切正常,除了我需要能够在按下游戏中的暂停按钮时暂停和恢复。

如果我取消它并尝试重新执行它,它会崩溃并显示IllegalStateException。 如果我取消它并在其位置实例化一个新的 AsyncTask,旧的 AsyncTask 将再次开始运行,而新的 AsyncTask 将同时运行。

有没有办法取消/暂停计时器并使用AsyncTasks 重新启动它,或者我应该采取不同的方式来执行此操作?

编辑:

这是我为解决方案所做的:

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

不确定这是否是最好的方法,但它对我有用。

【问题讨论】:

    标签: java android


    【解决方案1】:

    我有一个 AsyncTask 充当 我的游戏倒计时。

    AsyncTask 的用法不好。 AsyncTasks 应该做好工作,不要试图闲逛。对于倒数计时器,请使用postDelayed()——您甚至不需要后台线程。或者,使用CountDownTimer

    如果我取消它并尝试重新执行 它,它崩溃了 IllegalStateException。

    documentation 声明:“该任务只能执行一次(如果尝试第二次执行将引发异常。)”

    【讨论】:

    • 感谢您的信息。研究 postDelayed() 和 Handlers 我想我找到了一个合适的解决方案。
    • @Matt Swanson,你会通过更新上述帖子分享合适的解决方案吗?
    【解决方案2】:


    这是另一种暂停 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();
            }
        }
    

    【讨论】:

      【解决方案3】:

      致 JaySS,

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

      【讨论】:

        猜你喜欢
        • 2013-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-15
        • 2012-03-04
        • 1970-01-01
        相关资源
        最近更新 更多