#java #android
#java #Android
Вопрос:
В моей деятельности мое приложение загружает список чего-либо с веб-сайта через Http-соединение. Прежде чем этот список вещей отобразится на экране, у меня есть загрузка…TextView с небольшой вращающейся панелью прогресса, указывающей, что данные загружаются в настоящее время.
Я заметил, что если я выполняю какие-либо действия Thread.sleep()
в процессе извлечения данных из Интернета, это приостанавливает вращение ProgressBar
.
Даже если я помещу метод в его собственный Handler Runnable
, чтобы он был в его собственном потоке, анимация по-прежнему зависает.
Могу ли я что-нибудь с этим поделать?
Ответ №1:
Да, используйте AsyncTask.
Handler
Обычно A присоединяется к потоку пользовательского интерфейса. Публикация Runnable
s в нем не меняет того факта, что они будут выполняться в потоке пользовательского интерфейса.
Комментарии:
1. О, интересно… Должно быть, я неправильно понял это в отношении Runnables. Спасибо!
Ответ №2:
Любое приложение должно выполнять длительные задачи в отдельном потоке для потока пользовательского интерфейса, поскольку любые блокирующие вызовы не позволят обновлять пользовательский интерфейс.
Как сказал другой плакат, использование только Runnables не означает, что код будет выполняться в отдельном потоке. В этом случае метод run() будет выполняться в любом потоке, в котором был создан ваш объект-обработчик. Либо создайте подкласс Thread, либо передайте свой runnabe в новый объект thread с общедоступным потоком (Runnable runnable).
Поможет использование асинхронных задач, загрузчиков или потоков.
Также прочитайте Проектирование для быстрого реагирования и многопоточности для повышения производительности. Следование вышеуказанным подходам поможет вам избежать ошибок
Ответ №3:
Причина такого поведения заключается в том, что: когда вы выполняете thread.sleep() внутри runnable, именно поток пользовательского интерфейса выполняет этот runnable, а не соответствующий другой поток, который вы создали. По сути, происходит то, что когда вы отправляете любой запускаемый объект через обработчик потока пользовательского интерфейса, поток пользовательского интерфейса будет опрашивать из своей очереди и выполнять запускаемый объект; в этом случае запускаемый объект будет выполнять режим ожидания.
Следовательно, никаких изменений в индикаторе выполнения