我正在使用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(); }
}
}
答案 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,因为调用已经入队并且不会同时运行)。