У MainActivity есть обработчик, который обрабатывает сообщения от службы USB
Это плохой план.
В моем приложении несколькоДействия, и многие из них имеют представления, которые должны измениться, если определенные данные попадают через последовательный порт.
Это показывает, почему плохой план не является хорошим.Данные, поступающие из последовательного порта, не привязаны исключительно к MainActivity
... так почему бы MainActivity
обрабатывать служебные сообщения USB?
(также вполне вероятно, что вам не нужно выполнять несколько действийздесь и вместо этого есть одно действие с несколькими фрагментами, но я пока оставлю это в стороне)
Какие есть альтернативы для достижения того, что мне нужно
Я незнать, что находится на другом конце последовательного порта, который вызывает отправку сообщений.Для целей этого ответа я назову его «штуковиной».
Шаг # 1: Создайте ThingyRepository
.Это будет класс (с единичным экземпляром), который управляет последовательным соединением USB и принимает сообщения.Он будет удерживать некоторое представление текущего состояния на основе прошлых сообщений (ThingyState
) и обновит это состояние по мере поступления новых сообщений.
Шаг # 2: ThingyRepository
выставить какое-то "реактивный API ".Это может быть что-то современное, например, LiveData
или RxJava.Это может быть что-то более старое, например, основанный на обратном вызове API.В любом случае вы хотите, чтобы ThingyRepository
доставлял обновленные ThingyState
объекты заинтересованным сторонам («наблюдателям») при изменении состояния.Итак, ThingyRepository
преобразует последовательные сообщения USB в обновленные состояния и при необходимости выдает эти состояния.
Шаг № 3: ваш пользовательский интерфейс наблюдает ThingyRepository
, получает объекты ThingyState
и обновляет пользовательский интерфейсна основании этих состояний.В идеале вы должны использовать ViewModel
для передачи данных, для изменения конфигурации Android (поворот экрана и т. Д.).Но, если вы хотите остаться "старой школой", действие может зарегистрировать обратный вызов с вашим ThingyRepository
, где ThingyRepository
может вызвать обратный вызов с новым ThingyState
, поскольку данные изменяются в зависимости от сообщений USB.
Теперь вы отделили изменения состояния от любого отдельного действия.Каждое действие может быть ответственным за выяснение того, что необходимо изменить в его собственном интерфейсе на основе нового состояния.И вам больше не нужны статические представления.