Использование ASyncTask, когда работа должна выполняться линейно - PullRequest
0 голосов
/ 15 ноября 2010

У меня есть работа, которую необходимо выполнить в следующем порядке:

В основном задании: -Показать диалог прогресса -Получить и разобрать XML из веб-диалога -Отключить -Переключиться к действию ListView, которое использует массив из проанализированного XMLв первом действии

Моя проблема в том, что, поскольку у меня есть работа по извлечению / анализу в ASyncTask, основное действие немедленно пытается загрузить новое действие, даже если мне нужно, чтобы работа по извлечению / анализу была выполнена сначала, потому что этополучает данные для listView (новое действие).Как я могу убедиться, что новое действие не загружается, пока работа ASyncTask не будет завершена?

Вот пример того, с чем я работаю:

   public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    Button submit = (Button) findViewById(R.id.submitButton);

    submit.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {


            EditText text = (EditText) findViewById(R.id.entry);

            input = text.getText().toString();
            input = input.replace(" ", "%20");  //replace spaces with %20 for URL specification         

            WeatherRetrievalTask wt = new WeatherRetrievalTask();
        wt.execute();

            Bundle bun = new Bundle();
            bun.putParcelableArray("in", (Parcelable[])weather);

            Intent myIntent = new Intent(view.getContext(), WeeklyDisplayActivity.class);
            myIntent.putExtras(bun);
            startActivityForResult(myIntent, 0);
        }

    });
}

* Игнорировать эту работу пакета,так как это тема для другого вопроса, который мне нужно задать ...

Итак, startActivityForResult должен дождаться завершения ASyncTask и закрытия диалогового окна, прежде чем он запустится, потому что сначала ему нужны данные о погоде, чтобызаполнить вид списка.

1 Ответ

0 голосов
/ 15 ноября 2010

Вы должны сделать это «Перейти к списку действий» в этом onPostExecute () в вашей ASyncTask.
Не пишите код, который будет использовать результат ASyncTask сразу после вызова его execute (), потому что он будет выполняться до завершения асинхронной задачи, которая будет работать как другой поток.
Поэтому выполняйте работу, в которой нужно использовать результат asynctask doinbackground () в его методе onPostExecute ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...