Последовательное выполнение функций Android

#android #networking #sequence

#Android #сеть #последовательность

Вопрос:

Я знаю, что пользовательский интерфейс Android на самом деле не предназначен для выполнения функций и ожидания их завершения, однако я думаю, что есть варианты использования, если это требуется, например, для работы в сети.

Моя проблема в том, что я хочу запустить серию сетевых операций, которые зависят друг от друга и занимают немного больше времени, чем доли секунды, которые требуются для следующего выполнения, поэтому некоторое ожидание в порядке:

  1. Запустить горячую точку
  2. Получить сетевые интерфейсы и IP
  3. Запустить сокет

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