Android — Thread.sleep и Handler.postDelayed() замораживают анимированные элементы пользовательского интерфейса

#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, а не соответствующий другой поток, который вы создали. По сути, происходит то, что когда вы отправляете любой запускаемый объект через обработчик потока пользовательского интерфейса, поток пользовательского интерфейса будет опрашивать из своей очереди и выполнять запускаемый объект; в этом случае запускаемый объект будет выполнять режим ожидания.

Следовательно, никаких изменений в индикаторе выполнения