Подтвердить что ты не робот

OnCreateView() ждет выполнения AsyncTask?

Вот моя ситуация:

В моем onCreate() я хотел бы создать AsyncTask для извлечения данных для сервера и сохранения его в ArrayList.

Затем в моем onCreateView() я хотел бы поместить эти данные в ListView, установить onItemClickListener и т.д.

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

Я хотел бы как-то убедиться, что я жду, пока AsyncTask завершит выполнение перед запуском функции onCreateView(). Это возможно? Я прочитал об использовании get() в задаче, но у меня были некоторые проблемы с ее выполнением. Кажется, он ничего не делал.

Причина, по которой я хотел бы получить данные в onCreate() и установить адаптер в onCreateView() (вместо установки адаптера в onPostExecute() AsyncTask), заключается в том, что я хотел бы получить данные один раз, и иметь возможность просто создать представление, если пользователь поворачивает экран или переходит к такому Fragment.

4b9b3361

Ответ 1

Вот лучший способ. Инициализируйте свой ListView и запустите AsyncTask в onCreate(). Как только данные будут доступны с сервера, вы добавите его в тот же массив, который был передан вашему адаптеру, и вызовите notifyDatasetChanged() вашего адаптера, который позаботится о заполнении вашего списка. Здесь вы можете использовать ListFragment, в котором вы можете вызвать setEmptyText(), чтобы добавить текст, который отображается, если ваш список пуст.

Ответ 2

Вам следует следовать @sujith ответам и изменить вашу реализацию, но вот ответ на ваш конкретный вопрос:

Я хотел бы каким-то образом убедиться, что я жду, когда AsyncTask будет завершите выполнение перед запуском функции onCreateView(). Это возможно?

Да, это возможно, но это предотвратит отображение вашего пользовательского интерфейса, пока он ждет завершения задачи.

Создайте и выполните свой AsyncTask, затем держитесь за ссылку на него:

MyAsyncTask mTask;

...
...onCreate()
mTask = new MyAsyncTask();
mTask.execute();
...
...onCreateView()
myInfo = mTask.get();
super.onCreateView().

В вашем случае это плохая идея, однако, есть моменты, когда вам может понадобиться сделать что-то вроде этого.

EDIT: mTask.get() вернет все, что возвращается doInBackground()

Ответ 3

Что бы вы ни делали в onCreateView(), переместите его на onViewCreated()

onViewCreated вызывается после того, как представление готово, поэтому у вас не будет проблем, а затем