Android-приложение: дважды вызывать AsyncTask? - PullRequest
4 голосов
/ 01 марта 2012

Я использую 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()

Это невозможно сделать?Я получаю все вышеперечисленное, чтобы работать ... ЗА ИСКЛЮЧЕНИЕМ Я получаю дополнительный вызов 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(); }

}
}

Ответы [ 2 ]

5 голосов
/ 01 марта 2012

Вы можете выполнить экземпляр 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 становится истинным, поскольку значение g_GetWhat изменилось.

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

Значение для g_GetWhat фактически равно 2, поэтому вы видитерезультат, который вы видите.Вы должны передать g_GetWhat в AsyncTask, когда вы вызываете его, и сделать его переменной экземпляра задачи.

0 голосов
/ 01 марта 2012

Если вам нужно выполнить несколько одновременных работ в фоновом режиме, вам следует использовать класс Service в Android (не IntentService, поскольку вызовы ставятся в очередь и не выполняются одновременно).

...