Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android应用程序:调用AsyncTask两次?_Java_Android_Background_Android Asynctask - Fatal编程技术网

Java Android应用程序:调用AsyncTask两次?

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

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

我的调试行应如下打印:

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" });,您没有在变量中跟踪该实例,这不是问题吗?例如,如果
活动
已销毁,则无法取消
异步任务
。。。