Java Android应用程序:调用AsyncTask两次?
我使用AsyncTask和一些非常常见的Android代码来获取远程网页的内容。根据返回的内容,我可以调用另一个页面 我的调试行应如下打印:Java Android应用程序:调用AsyncTask两次?,java,android,background,android-asynctask,Java,Android,Background,Android Asynctask,我使用AsyncTask和一些非常常见的Android代码来获取远程网页的内容。根据返回的内容,我可以调用另一个页面 我的调试行应如下打印: DownloadWebPageTask task = new DownloadWebPageTask(); task.execute(new String[] { "http://google.com" }); 这不可能吗?我让以上所有的工作。。。除了在第8行和第9行之间出现一个对EndB()的附加调用 我一辈子都不知道为什么。看起来它不应该调用End
DownloadWebPageTask task = new DownloadWebPageTask();
task.execute(new String[] { "http://google.com" });
这不可能吗?我让以上所有的工作。。。除了在第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(); }
}
}
私有类下载WebPagetTask扩展异步任务
{
受保护的void onPreExecute()
{
调试(“onPreExecute()”;
}
受保护的字符串doInBackground(字符串…URL)
{
调试(“doInBackground()”;
}
受保护的void onPostExecute(字符串结果)
{
调试(“onPostExecute()”;
如果(g_GetWhat==1){EndA();}
如果(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()
返回时,下一条if语句的计算结果为true,因为g_GetWhat
的值已更改
if(g_GetWhat == 1) { EndA(); }
if(g_GetWhat == 2) { EndB(); }
g_GetWhat
的值实际上是2,这就是您看到所看到结果的原因。调用AsyncTask时,应将g_GetWhat传递到AsyncTask中,并将其作为任务的实例变量。如果需要在后台同时执行多个工作,则应使用Android中的服务类(而不是IntentService,因为调用已排队,并且不会同时运行)。如文档所述“任务只能执行一次(如果尝试第二次执行,将抛出一个异常。)”因此,我不能执行两次?用户必须退出整个应用程序,稍后再运行它?有什么好处“哦,你已经使用了该代码,你再也不能使用它了”?)我没有看到任何“抛出异常”“。任何Android应用程序都无法抓取2个网页?该任务的一个实例只能执行一次。OP创建AsyncTask的第二个实例。如果使用new DownloadWebPagetTask().execute(新字符串[]{”http://yahoo.com" });代码>,您没有在变量中跟踪该实例,这不是问题吗?例如,如果活动
已销毁,则无法取消异步任务
。。。