Вы можете создать ViewModel с областью действия, которая будет совместно использоваться Fragment / Activity / Service.
class AudioPlayerViewModel: ViewModel {
val songLiveData = MutableLiveData<Song>()
fun playSong() {
// Todo your logic
}
fun stopSong() {
// Todo your logic
}
.
.
.
}
Каждое изменение, которое вы сделаете в своей песне, будет выполняться с помощью ViewModel и Fragment / Activity / Service будет наблюдать за изменениями, происходящими в songLiveData, и соответственно обновлять пользовательский интерфейс.
Что касается сетевых запросов, я предлагаю вам взглянуть на библиотеку модернизации. Распространенной практикой является использование шаблона репозитория, который будет содержать все вызовы сети и БД, после чего вы можете получить экземпляр репозитория внутри своей модели представления и выполнить этот сетевой вызов. Вы можете использовать сопрограммы или Rx Java для обработки потоков.
Подводя итог:
Activity / Fragment / View / Services ...
Отвечает за взаимодействие с пользовательским интерфейсом наблюдайте данные из ViewModels и вносите изменения в пользовательский интерфейс в соответствии с этими данными.
ViewModel
Несет ответственность за взаимодействие между сетевым уровнем и тем, что видят пользователи. Они изменяют данные, чтобы пользовательский интерфейс оставался немым и не содержал никаких лог c.
Репозиторий
Ответственный за вызовы API и БД.