Android AsyncTask и

Привет, у меня есть AsyncTask в моем приложении, вызываемом в OnCreate(), которое извлекает некоторые данные через Интернет и отображает неопределенный индикатор выполнения во время загрузки.

Проблема в том, что когда я запускаю приложение, экран остается пустым до завершения AsyncTask. Код примерно такой.

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

    loadData();
    //Several UI Code   
    startAsyncTasks();
}


 private void startAsyncTasks(){
    new ConnectingTask().execute();
 }

person Martino    schedule 08.11.2010    source источник
comment
Итак, если вы закомментируете строку startAsyncTasks(), пользовательский интерфейс появится намного быстрее?   -  person Reuben Scratton    schedule 08.11.2010
comment
Вероятно, стоит опубликовать код вашего AsyncTask, так как проблема может заключаться в нем.   -  person Dave Webb    schedule 08.11.2010
comment
Просто убедитесь, что вы делаете все свои сети (долговременные вещи) внутри ConnectingTask.doInBackGround(). Это должно гарантировать, что основная реклама пользовательского интерфейса не будет заблокирована во время тяжелой работы, поэтому она сможет отображать элементы пользовательского интерфейса активности.   -  person Vit Khudenko    schedule 09.11.2010


Ответы (1)


OnCreate() выполняется до того, как действие будет показано на экране, поэтому весь процесс загрузки данных выполняется до отображения действия.

Решением может быть запуск AsyncTask в методе OnStart(), а не в OnCreate() (также переопределенном). OnStart() выполняется, пока активность будет отображаться на экране (см. жизненный цикл активности).

Это случай, который я реализовал в своем приложении, и он работает. Вы должны показывать диалог прогресса в методе OnStart(), а также обновлять и закрывать его в AsyncTask в нужные моменты.

Вот как это выглядит в моем приложении:

  1. AsyncTask запускается в действии OnStart() вместе с отображением диалогового окна
  2. Данные загружаются во внутренний класс, расширяющий AsyncTask
  3. После загрузки данных диалоговое окно закрывается и инициализируется дальнейшая обработка данных (OnPostExecute()).

Недостатком может быть то, что OnStart() вызывается при первом вызове активности, а также после ее восстановления (например, после сворачивания приложения). Таким образом, AsyncTask может выполняться несколько раз, в отличие от OnCreate(), который вызывается только один раз - при создании активности (а не при ее восстановлении).

Также могут возникнуть некоторые проблемы, если вы выполняете тест jUnit такой активности с диалогом в AsyncTask - дайте мне знать, если вы это сделаете - опубликуем какое-то решение

person Jacek Milewski    schedule 17.03.2012