Обновление данных, полученных через 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 шт):
Решил проблему при помощи банального viewBinding
'а.
В AudioFragment.kt перенёс lateinit var binding: FragmentAudioBinding
в Companion Object
, благодаря чему переменная стала доступна в AudioService.kt. При помощи неё можно получить доступ к элементам UI прямо из сервиса.
Метод, инициализирующий TextView
с позицией и длительностью аудио, перенёс в сервис.
Таким образом, в данном случае можно обойтись без EventBus
.
Предположу, что найденное мною решение небезупречно с концептуальной точки зрения, однако оно вполне рабочее.