Я использую exoplayer на Android. Мне нужно показать индикатор прогресса, когда видео ищется. Я могу начать показывать индикатор прогресса в методе seekTo, но какой метод обратного вызова мне следует использовать, чтобы скрыть индикатор прогресса, когда поиск завершен.
Обратный вызов Android exoplayer при завершении поиска
Ответы (3)
Реализовать ExoPlayer.EventListener
. Есть способ onPlayerStateChanged
. Когда playbackState == ExoPlayer.STATE_READY
, то скройте индикатор вашего прогресса.
onSeekProcessed()
, вы получите это через Player.EventListener
.
Краткий ответ: слушайте @Sough и используйте EventListener.onPlaybackStateChanged
с STATE_READY
.
Длинная история:
onSeekProcessed()
сначала звучит идеально, но он устарел, начиная с версии 2.12.0 ExoPlayer, со следующим комментарием:
@deprecated Обращения обрабатываются без задержек. Вместо этого слушайте #onPositionDiscontinuity (int) по причине #DISCONTINUITY_REASON_SEEK.
Итак, onPositionDiscontinuity(int)
следует использовать с причиной DISCONTINUITY_REASON_SEEK
.
Каким-то образом это заставило меня задуматься, действительно ли это сработает в момент, когда поиск завершен и видео готово к продолжению без какой-либо задержки (как в onSeekProcessed). Потому что семантически момент инициирования поиска уже может быть интерпретирован как разрыв позиции (как в случае, когда поиск обрабатывается без задержки).
И действительно, если вы посмотрите на временные рамки событий, которые я измерил во время выполнения, все становится очевидным:
0ms - <Seek initiated>
1ms - onPositionDiscontinuity -> DISCONTINUITY_REASON_SEEK
2ms - onPlaybackStateChanged -> STATE_BUFFERING
4ms - onSeekProcessed
208ms - onPlaybackStateChanged -> STATE_READY
Это показывает, что прослушивание onPlaybackStateChanged
с STATE_READY
по-прежнему является лучшим вариантом.
Заключение: onSeekProcessed
звучит действительно хорошо, но работает неправильно. Так что он устарел, и предлагается альтернатива. К сожалению, не так, как ожидалось. Сложно, но факт.