#android #networking #sequence
#Android #сеть #последовательность
Вопрос:
Я знаю, что пользовательский интерфейс Android на самом деле не предназначен для выполнения функций и ожидания их завершения, однако я думаю, что есть варианты использования, если это требуется, например, для работы в сети.
Моя проблема в том, что я хочу запустить серию сетевых операций, которые зависят друг от друга и занимают немного больше времени, чем доли секунды, которые требуются для следующего выполнения, поэтому некоторое ожидание в порядке:
- Запустить горячую точку
- Получить сетевые интерфейсы и IP
- Запустить сокет
Сначала я проверил, что все работает с помощью кнопок, затем он ждал между моими нажатиями кнопок. Но теперь я хотел бы автоматизировать это. Я погуглил, но все, что я нашел, — это решения с асинхронной задачей, которая устарела. Я пробовал с потоками и объединением, но это обычно вызывает странные сбои в runnable, и это не очень элегантно. Интересно, есть ли другое решение?
Ответ №1:
Лучшее, что вы можете сделать с помощью SDK, это использовать Executors
для последовательного выполнения вашей работы в фоновом режиме
val newSingleThreadExecutor = Executors.newSingleThreadExecutor()
newSingleThreadExecutor.execute {
// 1...
}
newSingleThreadExecutor.execute {
// 2...
}
Но если вы хотите прикоснуться к пользовательскому интерфейсу из фона, следует создать обработчик проверки, не является ли view not null
val handler = Handler(Looper.myLooper()!!)
newSingleThreadExecutor.execute {
handler.post {
view?.visibility = View.GONE
}
}
Комментарии:
1. Спасибо, вот и все! Раньше я работал с SingleThreadExecutors, но не думал об этом. Я скорректировал код для java: Шаги исполнителя = Executors.newSingleThreadExecutor(); steps.execute(this::fkt1); steps.execute(this::fkt2);…
Ответ №2:
Как насчет чего-то подобного?
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startHotspot();
getNetworkInterfaceAndIP();
startSocket();
}
}, 300);
Комментарии:
1. Разве это не просто выполнение всех трех, как обычно, за исключением задержки в 300 мс (но не для каждого, верно)?
2. Ну, 300 мс изменчивы, и они отличаются, поскольку вы помещаете их в handler.postDelayer, это то же самое, что запускать их в потоке.
3. Да, но я имею в виду, я хочу запустить fun1, дождаться его завершения, fun2, подождать … и т.д. Ваш обработчик просто ждет, fun1, fun2, fun3, верно? Конечно, я могу создать 3 обработчика, но исполнитель работает так, как я хотел.
4. О, я думал, вы хотите запустить их все в фоновом режиме, не имея 1 функции, ожидающей другой, извините, в этом случае мой ответ не имеет значения]