Обновление пользовательского интерфейса Android из потока в другом классе

Я видел несколько вопросов здесь, задающих подобные вопросы, но я еще не видел подходящего ответа. Многие люди спрашивают, как обновить пользовательский интерфейс из потока, но они почти всегда находятся в одном классе с пользовательским интерфейсом.

То, что я пытаюсь сделать, это обновить пользовательский интерфейс из потока, который был создан в другом классе. Я видел все предложения, такие как async, handlers, runnable и т. Д., Но у меня были реальные проблемы с их реализацией в отдельных классах.

Я пытаюсь сохранить свой класс пользовательского интерфейса минимальным и иметь дело только с взаимодействиями с графическим интерфейсом, например, когда пользователь нажимает кнопку. Теперь я создал новый поток в новом классе, который подключается к устройству Bluetooth, но затем я хочу изменить кнопку в потоке пользовательского интерфейса с кнопки «подключения» на кнопку «отключения» (т. Е. Изменить кнопка от создания гнезда Bluetooth до его закрытия).

Каков общий способ сделать это? Думаю ли я, что все это неправильно и все должно быть в одном классе? Как правильно взаимодействовать между основным классом пользовательского интерфейса и другими классами / потоками?

В идеале я хочу иметь возможность выполнять другие взаимодействия с пользовательским интерфейсом, поэтому какое-то решение, которое допускает другие изменения пользовательского интерфейса вне класса пользовательского интерфейса, было бы замечательно!