Android应用程序:调用AsyncTask两次?
我使用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(); }
}
}
只能一次执行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,并使它成为任务的一个实例变量。
如果你使用'new DownloadWebPageTask()。execute(new String [] {“http://yahoo.com”});',你不记录变量中的那个实例,是不是一个问题?例如,如果'Activity'被销毁,你不能取消'AsyncTask'。 – caw 2013-01-05 21:38:16
如果您需要在后台执行多个同时工作,那么您应该在Android中使用Service类(不是IntentService,因为调用已排队并且不会同时运行)。
正如文档所述:“该任务只能执行一次(如果尝试执行第二次执行,则会抛出异常)。” – 2012-03-01 01:12:12
因此,我可以*永远不会执行它两次?用户必须退出整个应用程序并稍后再运行它? “哦,你已经使用了这个代码,你永远不会再使用它”?) – Carol 2012-03-01 01:14:17
我没有看到任何“异常抛出”。 – Carol 2012-03-01 01:16:00