OnCreateView() ждет выполнения AsyncTask?
Вот моя ситуация:
В моем onCreate()
я хотел бы создать AsyncTask
для извлечения данных для сервера и сохранения его в ArrayList
.
Затем в моем onCreateView()
я хотел бы поместить эти данные в ListView
, установить onItemClickListener
и т.д.
Проблема в том, что я создаю гонку между AsyncTask
и потоком пользовательского интерфейса. Если вызов onCreateView()
вызывается до того, как выполняется AsyncTask
, то я не устанавливаю адаптер правильно, не устанавливайте onItemClickListener
и т.д.
Я хотел бы как-то убедиться, что я жду, пока AsyncTask
завершит выполнение перед запуском функции onCreateView()
. Это возможно? Я прочитал об использовании get()
в задаче, но у меня были некоторые проблемы с ее выполнением. Кажется, он ничего не делал.
Причина, по которой я хотел бы получить данные в onCreate()
и установить адаптер в onCreateView()
(вместо установки адаптера в onPostExecute()
AsyncTask
), заключается в том, что я хотел бы получить данные один раз, и иметь возможность просто создать представление, если пользователь поворачивает экран или переходит к такому Fragment
.
Ответы
Ответ 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
вызывается после того, как представление готово, поэтому у вас не будет проблем, а затем