Я начинаю действие и вызываю асинтаксическую задачу в onCreateView () для получения данных из веб-службы и заполнения данных в onPostExecute (). В настоящее время действие не загружается, пока не завершится асинхронная задача во фрагменте.
Как я могу сразу отобразить пустую форму и обновить ее по завершении задачи? Действие просто размещает фрагменты, а асинтаксические задачи находятся во фрагментах, если это имеет значение.
Фрагмент onCreateView ():
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_friends,container, false);
return v;
}
Фрагмент onActivityCreated ():
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
//getFriends() calls a method that is an asyntask
peopleList = getFriends();
if (peopleList!=null){
list = (ListView)getActivity().findViewById( R.id.friendsList);
list.setAdapter(new FriendsAdapter(getActivity(), peopleList,"friends") );
}
}
2 ответа
Это связано с тем, что вы заполняете данные onPostExecute (), которые подключаются к потоку пользовательского интерфейса только после завершения doInBackground (). Если вы хотите показать прогресс по мере того, как что-то происходит, вам нужно вызвать метод publishProgress ().
Теперь метод publishProgress () подключается к методу onProgressUpdate (), и это подключается к потоку пользовательского интерфейса, который обновляет поток пользовательского интерфейса во время выполнения doInBackground (). Я привел очень простой пример того, что делал когда-то на практике - посмотрите, как это работает. Он в основном продолжает обновлять ListActivity, по одному элементу за раз, и показывает этот прогресс на экране - он не ждет, пока все строки будут добавлены для отображения последней страницы:
class AddStringTask extends AsyncTask<Void, String, Void> {
@Override
protected Void doInBackground(Void... params) {
for(String item : items) {
publishProgress(item);
SystemClock.sleep(400);
}
return null;
}
@Override
protected void onProgressUpdate(String... item) {
adapter.add(items[0]);
}
@Override
protected void onPostExecute(Void unused) {
Toast.makeText(getActivity(), "Done adding string item", Toast.LENGTH_SHORT).show();
}
}
Вы должны выполнять как можно меньше трудоемких задач в методе onCreate () вашей Activity. Обратите внимание, что ваша форма будет нарисована только после того, как onCreate () будет «полностью» выполнен. Хорошая идея - начать трудоемкую задачу с таймера с небольшой задержкой (50–100 мс), чтобы быть уверенным, что ваш метод onCreate () завершил выполнение.
Вот пример (поместите это вместо getFriends ()):
Handler getFriendsDelayed = new Handler();
getFriendsDelayed.postDelayed(new Runnable()
{
public void run()
{
getFriends();
}
}, DELAY_IN_MILLISEC);
Надеюсь, это поможет.
Похожие вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.
//getFriends() calls a method that is an asyntask
Как метод может быть AsyncTask? Ты меня смущаешь.