Обновление данных, полученных через EventBus

Я использую библиотеку EventBus для передачи данных (позиция и длительность аудио) из сервиса с объектом Media Player'а во фрагмент, в котором этот сервис запускается.

AudioService.kt:

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    // ...
    EventBus.getDefault().post(
        PositionAndDurationData(
            mediaPlayer.duration,
            mediaPlayer.currentPosition
        )
    )
    // ...
}

AudioFragment.kt:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    // ...
    EventBus.getDefault().register(this@AudioFragment)
    // ...
}

@Subscribe(threadMode = ThreadMode.MAIN)
fun onEvent(result: PositionAndDurationData) {
    audioDuration = result.duration
    audioPosition = result.position
}

PositionAndDurationData.kt:

data class PositionAndDurationData(
    var duration: Int,
    var position: Int,
)

Как сделать так, чтобы передаваемые в UI данные обновлялись каждую секудну?


Ответы (1 шт):

Автор решения: Alexey Pavlov

Решил проблему при помощи банального viewBinding'а.

В AudioFragment.kt перенёс lateinit var binding: FragmentAudioBinding в Companion Object, благодаря чему переменная стала доступна в AudioService.kt. При помощи неё можно получить доступ к элементам UI прямо из сервиса.

Метод, инициализирующий TextView с позицией и длительностью аудио, перенёс в сервис.

Таким образом, в данном случае можно обойтись без EventBus.

Предположу, что найденное мною решение небезупречно с концептуальной точки зрения, однако оно вполне рабочее.

→ Ссылка