В Android приложении есть ситуации когда нужно выполнить метод после определенной задержки. Особенно полезно когда пользователь ввел данные и нужно с небольшой задержкой выполнить метод поиска. Теперь давайте рассмотрим как можно вызвать метод задав для него задержку.
Класс Handler и метод postDelayed(Runnable r, long delayMillis позволяют выполнить Runnable в котором будет наш код с определенной задержкой. Сама задержка задается в миллисекундах.
Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { // код выполняющийся после 5 секунд } }, 5000);
Для более удобной записи задержки в пять секунд лучше использовать класс TimeUnit, который позволяет выбрать единицы измерения времени и сделать простым преобразование единиц времени, например преобразовать секунды в миллисекунды. В следующем примере мы рассмотрим как лучше задавать задержку.
Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { // код выполняющийся после 5 секунд } }, TimeUnit.SECONDS.toMillis(5));
Такая запись задержки будет выглядит больше, но гораздо лучше с точки зрения понимания. Можно определить константу если это улучшит читаемость и понимание кода.
Если вы хотите чтобы событие всегда приходило в главной поток Android приложения, то инициализируйте Handler
передавая Looper главного потока с помощью статического метода Looper.getMainLooper()
в конструктор и тем самым явно задав отправку всех сообщений в главный поток.
Handler handler = new Handler(Looper.getMainLooper());
Теперь все сообщения будут приходит с задержкой только в главный поток.
Обратите внимание в каком потоке создается Handler
По умолчанию сообщения отправляются в поток в котором был создан экземпляр класса Handler. Поэтому нужно следить в каком потоке вы создаете Handler или явно передавать Looper главного потока в конструктор.
Мы рассмотрели способ как можно вызвать метод с задержкой, а также как задать отправление сообщений только в главный поток и почему важно знать в каком потоке создается Handler
.
Комментариев нет:
Отправить комментарий