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() из фонового потока и поместить туда всю тяжелую работу.

Другие вопросы по тегам