2012-03-01 69 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,因为调用已排队并且不会同时运行)。