Лучший способ поделиться одним и тем же экземпляром данных между Activity, Fragment и Service? - PullRequest
0 голосов
/ 07 августа 2020

Я являюсь разработчиком-любителем android, и я создаю приложение Musi c Player, и мне нужно иметь один и тот же экземпляр объекта (объект Song) в моих Activity, Fragment и Service, и все они способны манипулировать состояние объекта. Пользователь может воспроизвести / приостановить / следующую / предыдущую песню, и все они должны отображать одну и ту же информацию о текущей песне и состояние песни, если она ПРИОСТАНОВЛЕНА или ВОСПРОИЗВЕДЕНИЕ.

My Activity может изменить состояние песни с помощью макет дна, сохраняющийся на всех фрагментах. Мои фрагменты могут изменять состояние песни, выбирая / приостанавливая песни на странице списка воспроизведения. Моя служба может изменить состояние песни через панель уведомлений, приостановив / возобновив / следующую / предыдущую песню.

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

Также извлекаются URL-адреса песен, которые будут воспроизводиться с сервера. Где лучше всего делать вызовы API?

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

С уважением,

1 Ответ

1 голос
/ 07 августа 2020

Вы можете создать 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 и БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...