2010-03-19 189 views
3

我有一个AsyncTask,它充当我的游戏的倒数计时器。当倒计时完成后,它会显示超时时间结束屏幕,并更新屏幕上显示的计时器。一切正常,除非我需要在游戏中的暂停按钮被按下时暂停和恢复。暂停和恢复AsyncTasks? (Android)

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

有没有办法取消/暂停计时器,并使用AsyncTask s重新启动它还是有不同的方式,我应该这样做吗?

编辑:

这是我做了一个解决方案:

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

不知道,如果是去了解它的最佳方式,但它为我工作。

回答

13

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

这不是一个很好的使用AsyncTaskAsyncTasks应该做的工作,并做好,不要试图徘徊。对于倒数计时器,请使用postDelayed() - 您甚至不需要后台线程。或者,使用CountDownTimer

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

documentation规定:“任务可以只执行一次(一个异常将被抛出,如果第二试图执行。)”

+0

感谢您的信息。看着postDelayed()和Handlers,我想我找到了一个合适的解决方案。 – 2010-03-19 15:12:53

+0

@Matt Swanson,你会通过更新上面的帖子分享合适的解决方案吗? – eros 2011-08-25 07:39:26

1

要JaySS,

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