ProgressDialog умер, да здравствует ProgressBar!
Теги: Java, Android, ProgressDialog, ProgressBar, Translate
Вольный перевод статьи Ben Daniel A. “Farewell ProgressDialog, Long Live ProgressBar”.
Если вы такойже как я, то вы использовали progress dialog почти в каждой части ваших приложений. И поэтому вы должны знать, что класс ProgressDialog объявлен как deprecated в API 26. Теперь, прежде чем вы начнете использовать аннотацию @SuppressWarnings("deprecation")
, остановитесь и подумайте над этим. Что послужило главной причиной того, что команда Android UX приняла решение отказаться от ProgressDialog? Понятно, что они провели исследования и решили, что блокировка интерфейса (включая back button), когда используется ProgressDialog и выполняется длительная операция, это не самый оптимальный вариант для большинста приложений. Пользователи могут изменить свои намерения в любой момент использования вашего приложения, и они не должны быть вынуждены ждать, когда ProgressDialog завершит работу, чтобы использовать свое устройство.
Некоторое время назад я заметил подобное изменение дизайна в Android-приложении Twitter. В процессе отправки твита нет progress dialog. Они решили оптимизировать способ показа статуса отправки твита: поместили его в нотификации. Пользователь может продолжать работу с приложением, пока твит отправляется. Если отправка успешна, нотификация с progress bar пропадает. Твит, отправка которого не завершилась, остается в уведомлениях, позволяя пользователю отправить его повторно.
Мне нравится такой подход, он прост для понимания. Однако, что русскому хорошо, то немцу смерть. И это и есть причина, по которой такая штука как ProgreesBar должна была появиться. ProgressBar не блокирует интерфейс, но обеспечивает ту же обратную связь, что и ProgressDialog. Существует множество способов обеспечить обратную связь progress bar на экране и фоновой задачи.
Вы можете выбрать круговой индикатор рядом с View, которая вызвала эту операцию. Например, если у нас есть окно входа, то рядом с кнопкой входа должен появляться progress bar, который сообщает о том, что работает операция входа. Обратите внимание, что для избегания ситуации, когда кнопка входа нажимается много раз, вы можете сделать ее неактивной во время операции входа Если вход не был успешен, сообщите об этом и активируйте кнопку. Подобное можно сделать, используя RxJava и Android’s Observable.
Вы можете создать progress bar в верхней части вашего экрана, это легко реализовать, если у вас одна Activity и несколько Fragment. Макет Activity будет содержать progress bar и Fragment должны сообщать о выполнении операции, чтобы Activity получала сигнал об изменении progress bar (такая логика может быть реализована также с помощью RxJava).
Пожалуйста, не ограничивайтесь только этими двумя способами, есть другие крутые альтернативы использования диалога progress, как мы могли видеть на примере приложения Twitter. Теперь, когда Android принял смелое решение о том, чтобы объявить класс ProgressDialog deprecated, я надеюсь, что эксперты UX придумают множество способов показывать progress bar, позволяя пользователь в то же время взаимодействовать со своим экраном.
Бывает и так, что когда работает progress bar, мы должны сделать неактивным остальной интерфейс. Для этого можно испольовать такой трюк:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
Когда вы закончите, вы можете отменить это, используя:
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
Приятного рефакторинга 👍.
Дополнительное чтение о ProgressBar.