Возможно ли приостановить выполнение функции, а затем из другой функции возобновить выполнение первой?
Архитектура MVVM. Есть некий менеджер в котором выполняется тяжелая функция main() во время выполнении может оказаться, что нужны дополнительные данные от пользователя, тогда функция сетает LiveData необходимым значением. Вью подписана на это через вьюмодель, и выдаёт пользователю DialogFragment с запросом необходимых данных, введённые данные передаются во вью через onActivityResult, в котором вызывается метод setUserInput(userInput) возвращающий эти данные в менеджер(через вызов промежуточного метода во вьюмодель) и, например, кладет их в переменную userInput в менеджере. И вот тут возникают сложности, нужно, чтобы метод main() приостанавливался, до момента прихода введённых данных. Возможно ли его приостановить изнутри, а потом возобновить его работу снаружи из другого метода? Или может есть более простые способы решающие данную задачу? Пытался это реализовать на корутинах, но так и не смог понять как возобновить работу метода извне.
Ответы (1 шт):
Самый простой и скорее всего правильны способ это разбить это все на шаги.
Условно вы начинаете в funA() что-то считать. Вы доходите до точки где вам нужны какие-то данные. Тут вы смотрите если данные есть то вызываете funB() которая из обрабатывает. Если данных нет то вы показываете пользователю диалог. После ввода данных вы вызываете funB().
Каждый этап должен быть отдельным шагом и работать независимо от других шагов, а промежуточные состояния сохраняться отдельно. У вас в этот флоу может добавиться ещё пачка других действий и вы потом зароетесь в этом коде.
Если вы посмотрите на такую штуку как SOLID, то там можно увидеть 2 принципа:
Принцип единой ответственности, который говорит, что каждая сущность должна решать только одну задачу и есть только одну причину для изменения.
Принцип разделения интерфейсов, который говорит о том что если вы видите какой-то большой интерфейс, то его нужно разбивать. "Разделяй и Властвуй".
То что вы хотите сделать нарушает оба этих принципа. Вы хотите написать метод который решает несколько задач (вычисляет что-то, запрашивает данные у пользовался) и написать флоу который объединяет целый пак действий