ProgressBar не оживляет во время надувания viewstub
У меня есть активность с этой структурой:
FrameLayout
ProgressBar
ViewStub
ViewStub раздувает фрагмент в отдельном потоке. Что мне нужно, это отображать прогресс во время загрузки фрагмента. Проблема в том, что ProgressBar не вращается, пока заглушка надувается (в моем случае около полсекунды: это тяжелый фрагмент) Я перепробовал все: показ / скрытие представления, аннулирование, показ их в ViewSwitchers... и т. Д., Ничего работает, как только ViewStub раздувается, он начинает вращаться, это похоже на то, что пользовательский интерфейс заморожен, пока он раздувается, но выполнение этого в другом потоке, кажется, не улучшается. Что я должен делать?
2 ответа
Фрагмент должен быть загружен в поток пользовательского интерфейса, а поскольку пользовательский интерфейс занят фрагментом, ProgressBar не вращается. Вы должны отделить загрузку данных во фрагменте от интерфейса. Я бы протестировал и проверил, что именно работает и не позволяет фрагменту запускаться быстро, я бы использовал загрузчик, чтобы загрузить данные и представить прогресс-бар пользователю (внутри фрагмента) . Да, перенесите прогресс в макет фрагмента и управляйте всем оттуда, потому что я не хочу знать, когда завершится загрузка фрагмента, действие не предполагает заботы об этом.
По сути, то, что @Luksprog сказал в своем комментарии, правильно, если вы вызываете viewStub.post(), это НЕ запускает код внутри поста в фоновом потоке. Все, что он делает - это публикует исполняемый файл в потоке пользовательского интерфейса. Это может работать, если вы делаете
new Thread(new Runnable() {
@Override
public void run() {
viewStub.inflate();
initFragment();
}
}).start()
Хотя, как сказал @Luksprog, создание экземпляров представлений в фоновом потоке - плохая практика. Так что, возможно, лучшее решение - переместить вызов.inflate() наружу (в основной поток), а затем вызвать initFragment() из фонового потока и поместить туда всю тяжелую работу.