2012-03-01 51 views
4

我使用AsyncTask和一些非常常見的Android代碼來獲取遠程網頁的內容。根據返回的內容,我可以再打另一個頁面。Android應用程序:調用AsyncTask兩次?

http://developer.android.com/reference/android/os/AsyncTask.html

我調試線應打印這樣的:

1> StartA() 
2> onPreExecute 
3> doInBackground 
4> onPostExecute Note: Code here will call EndA() 
5> EndA() 
6> 
7> StartB() 
8> onPreExecute 
9> doInBackground 
10> onPostExecute  Note: Code here will call EndB() 
11> EndB() 

那是不可能的呢?我得到所有上述工作......除了我得到一個附加電話呼籲EndB()出現在第8和第9行之間。

我不能爲我的生活找出原因。沒有看起來應該調用EndB()兩次。它絕對不應該被稱爲9和10之前。

private void StartA() 
{ 
    Debug("StartA()"); 

    g_GetWhat = 1; 
    DownloadWebPageTask task = new DownloadWebPageTask(); 
task.execute(new String[] { "http://google.com" }); 

} 

private void EndA() 
{ 
    Debug("EndA()"); 

    StartB(); 
} 

private void StartB() 
{ 
    Debug("StartB()"); 

    g_GetWhat = 2; 
    DownloadWebPageTask task = new DownloadWebPageTask(); 
task.execute(new String[] { "http://yahoo.com" }); 

} 

private void EndB() 
{ 
    Debug("EndB()"); 
} 

////////////////////////////// /////////////////////

private class DownloadWebPageTask extends AsyncTask<String, Void, String> 
{ 
protected void onPreExecute() 
    { 
     Debug("onPreExecute()"); 

    } 

protected String doInBackground(String... urls) 
    { 
    Debug("doInBackground()"); 
} 

protected void onPostExecute(String result) 
{ 

    Debug("onPostExecute()"); 
    if(g_GetWhat == 1) { EndA(); } 
    if(g_GetWhat == 2) { EndB(); } 

} 
} 
+0

正如文檔所述:「該任務只能執行一次(如果嘗試執行第二次執行,則會拋出異常)。」 – 2012-03-01 01:12:12

+0

因此,我可以*永遠不會執行它兩次?用戶必須退出整個應用程序並稍後再運行它? 「哦,你已經使用了這個代碼,你永遠不會再使用它」?) – Carol 2012-03-01 01:14:17

+0

我沒有看到任何「異常拋出」。 – Carol 2012-03-01 01:16:00

回答

5

只能一次執行AsyncTask實例。您實際上是創建兩個實例,但你應該反正這樣稱呼它,以便它可以永遠記得:

new DownloadWebPageTask().execute(new String[] { "http://yahoo.com" }); 
new DownloadWebPageTask().execute(new String[] { "http://google.com" }); 

,而不是像這樣:

DownloadWebPageTask task = new DownloadWebPageTask(); 
task.execute(new String[] { "http://google.com" }); 

我覺得你運行到這裏的問題:

private void EndA() 
{ 
    Debug("EndA()"); 

    StartB(); 
} 

您的g_GetWhat價值得到儘快STARTB開始改變。因此,當執行從EndA()返回時,由於g_GetWhat的值已更改,下一條if語句的計算結果爲true。

if(g_GetWhat == 1) { EndA(); } 
if(g_GetWhat == 2) { EndB(); } 

g_GetWhat的值實際上是2,這就是爲什麼你看到你所看到的結果。當你調用它時,你應該將g_GetWhat傳遞給你的AsyncTask,並使它成爲任務的一個實例變量。

+0

如果你使用'new DownloadWebPageTask()。execute(new String [] {「http://yahoo.com」});',你不記錄變量中的那個實例,是不是一個問題?例如,如果'Activity'被銷燬,你不能取消'AsyncTask'。 – caw 2013-01-05 21:38:16

0

如果您需要在後臺執行多個同時工作,那麼您應該在Android中使用Service類(不是IntentService,因爲調用已排隊並且不會同時運行)。