Android应用:两次调用AsyncTask?

时间:2012-03-01 01:05:21

标签: java android background android-asynctask

我正在使用AsyncTask和一些非常常见的Android代码来获取远程网页的内容。根据返回的内容,我可以调用另一个页面。

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

这不可能吗?我得到了以上所有内容...除了我在第8行和第9行之间出现一个对EndB()的附加调用。

我不能为我的生活找出原因。没有什么看起来应该两次调用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(); }

}
}

2 个答案:

答案 0 :(得分: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();
}

一旦StartB开始,g_GetWhat的值就会发生变化。因此,当执行从EndA()返回时,下一个if语句的计算结果为真,因为g_GetWhat的值已经改变。

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

g_GetWhat的值实际上是2,这就是您看到结果的原因。当你调用它时,你应该将g_GetWhat传递给你的AsyncTask,并使它成为任务的实例变量。

答案 1 :(得分:0)

如果你需要在后台同时做多个工作,那么你应该在Android中使用Service类(而不是IntentService,因为调用已经入队并且不会同时运行)。