2010-11-08 2 views
3

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

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

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

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


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

Итак, если вы закомментировать startAsyncTasks() линии, пользовательский интерфейс выглядит намного быстрее? –

+2

Возможно, стоит опубликовать код вашей AsyncTask, поскольку проблема может быть там. –

+0

Просто убедитесь, что вы делаете все свое сетевое взаимодействие (long running stuff) внутри ConnectionTask.doInBackGround(). Это должно гарантировать, что основной пользовательский интерфейс не будет заблокирован во время тяжелой работы, поэтому он сможет отображать элементы пользовательского интерфейса. –

ответ

1

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

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

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

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

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

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

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

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