2010-09-24 26 views
2

我正在開發一個應用程序,用於解析HTML中的數據。其中一個被解析的數據是一個隨時間增加的整數,而不是不斷請求數據,我希望有一個間隔整數的任務。由於我需要將值更新到TextView中,我決定使用AsyncTask而不是定時器。如何重新啓動AsyncTask或避免運行

我的問題是我希望能夠重新啓動我的任務,一旦我知道它已經完成,或者如果它目前正在運行,只是避免操縱它。

這裏是我的AsyncTask:

class TurnsUpdate extends AsyncTask<Void, Integer, Exception> 
{ 
    protected void onPreExecute() 
    { 
     turns = Integer.parseInt(DATABASE.getValue("turns").replaceAll(" T", "")); 
    } 

    protected Exception doInBackground(Void...voids) 
    { 
     while (turns < maxTurns) 
     { 
      try 
      { 
       Thread.sleep(sleep); 
      } 
      catch (InterruptedException e) 
      { 
       return e; 
      } 

      turns++; 
      publishProgress(turns); 
     } 
     return null; 
    } 

    protected void onProgressUpdate(Integer... turns) 
    { 
     infoTurns.setText(Integer.toString(turns[0]) + " T"); 
    } 

    protected void onPostExecute(Exception e) 
    { 
     vibrator.vibrate(500); 
    } 
} 

我嘗試啓動或避免:

if ((HOME.updateTurns == null || HOME.updateTurns.getStatus() == AsyncTask.Status.FINISHED) && HOME.updateTurns.getStatus() != AsyncTask.Status.RUNNING) 
    { 
     HOME.updateTurns = (UpdateTurns) new UpdateTurns(); 
     HOME.updateTurns.execute(); 
    } 

我要對這個正確?

+0

我使用TurnsUpdate創建了自己的公共類,並使infoTurns成爲受保護的參考,從而解決了這個問題。據我所知,這一切都可以工作。 – 2010-09-24 20:06:42

+0

我說得太快了。我在完成完成後重新啓動AsyncTask仍然有問題,或者在運行時避免它。 – 2010-09-24 20:33:09

回答

3

您是否嘗試過只是讓一個遞歸調用:

new UpdateTurns().execute() 
在onPostExecute

?從技術上講,它應該工作,因爲onPostExecute中的任何代碼都在UI線程上運行,而不是在AsyncTask中創建的線程。

+0

那實際上工作。謝謝。 – 2010-09-25 00:04:06

1

當試圖在狀態爲FINISHED的AsyncTask上調用.execute()時,我不斷收到異常。我終於找到了這條線在API中:

任務只能執行一次(如果第二試圖執行一個異常將被拋出。)

來源:http://developer.android.com/reference/android/os/AsyncTask.html下的「穿透規則」

+0

我從事這個項目已經有一段時間了,但如果我沒有記錯的話,我總是會創建一個新的AsyncTask來避免這個問題。 – 2012-02-23 07:11:24

相關問題