2012-03-01 2 views
4

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

} 
} 
+0

Как говорится в документе: «Задача может быть выполнена только один раз (при попытке выполнить второе выполнение будет выбрано исключение).« –

+0

Итак, я могу * НИКОГДА не выполнять его дважды? Пользователь должен выйти из всего приложения и запустить его позже? Что хорошего «о, вы уже использовали этот код, вы НИКОГДА его не используете»?) – Carol

+0

Я не вижу никакого «исключения». – Carol

ответ

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(); 
} 

Ваше значение g_GetWhat становится изменилось, как только начинается StartB. Поэтому, когда выполнение возвращает из EndA(), следующий оператор if имеет значение true, поскольку значение g_GetWhat изменилось.

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

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

+0

Если вы используете 'new DownloadWebPageTask(). Execute (new String [] {" http://yahoo.com "});', вы не отслеживаете этот экземпляр в переменной, это не проблема ? Например, вы не можете отменить «AsyncTask», если «Активность» уничтожена ... – caw

0

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

Смежные вопросы