2010-03-19 176 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(); 
     } 
    }